Làm thế nào mà biểu thức lambda lại là đối tượng trong Java? [bản sao]

Nov 06 2020

Các đối tượng biểu thức lambda trong Java như thế nào? Làm thế nào để các biểu thức lambda, một phần của lập trình hàm, có thể được triển khai trong Java, một ngôn ngữ hướng đối tượng? Tôi cần những khái niệm Java nào để hiểu các biểu thức lambda?

Trả lời

2 JakubZnamenáček Nov 06 2020 at 19:17

Bạn cần hiểu một số điều:

1) Giao diện chức năng

  • giao diện chỉ có một phương thức công khai
public interface Runnable{
    void run();
}
  • đây là ví dụ về giao diện chức năng, nó có thể có các loại phương thức khác nhau như int processNumber(int number)
  • chỉ cần nhớ chỉ có thể có một phương thức (một phương thức không được triển khai, giá trị mặc định không được tính)

2) Sử dụng giao diện chức năng

  • bạn có thể triển khai giao diện chức năng của mình trong lớp của bạn, giả sử MyRunnable
public class MyRunnable implements Runnable{
    public void run(){
        System.out.println("Hello world");
    }
}
  • bạn có thể chuyển lớp MyRunnable của mình trong các phương thức khác đối tượng bình thường của nó
public class MyClass{
    public void myMethod(Runnable runnable){
        runnable.run();
    }
}
  • cái này sẽ in "Hello world"
public static void main{
    MyClass myClass = new MyClass();
    myClass.myMethod(new MyRunnable());
}

3) Lambda đang làm gì

  • vì vậy những gì lambda cho phép bạn làm là tạo triển khai ẩn danh của giao diện
public static void main{
    MyClass myClass = new MyClass();
    myClass.myMethod(() -> System.out.println("Hello my world"));
}
  • cái này sẽ in "Xin chào thế giới của tôi"
  • bạn chỉ đang tạo triển khai ẩn danh của Runnable và chuyển nó đến MyMethod
  • nó chỉ là đường cú pháp cho điều này
public static void main{
    MyClass myClass = new MyClass();
    myClass.myMethod(new Runnable{
        public void run(){
            System.out.println("Hello my world");
        });
}
1 m0skit0 Nov 06 2020 at 17:50

Một lambda trong Java về cơ bản chỉ là một giao diện chức năng . Nó chủ yếu là đường cú pháp .

Java không phải là một ngôn ngữ chức năng và do đó nó không thể thực hiện đầy đủ lập trình chức năng, chỉ là một tập hợp con của các nguyên lý cốt lõi của nó. Ví dụ: bạn không thể triển khai các kiểu chữ thích hợp trong Java .

Trong mọi trường hợp, không có định nghĩa tiêu chuẩn cho FP, giống như không có định nghĩa tiêu chuẩn cho OOP. Định nghĩa cụ thể có thể khác nhau tùy thuộc vào các nguồn, nhưng các ý tưởng tổng thể (thường) giống nhau.

Coder Nov 06 2020 at 19:04

Java là một ngôn ngữ hướng đối tượng. Nhưng một số tính năng từ các ngôn ngữ chức năng cũng có sẵn trong java như lambda

lambda về cơ bản là một đối tượng hoạt động giống như một hàm. tài liệu :https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html

như thường lệ, một hàm có một đầu vào và một đầu ra

đầu vào trong các chức năng: được gọi là T (như trong nhận)

đầu ra trong chức năng: được gọi là R (đổi lại)

cấu trúc của khai báo: Function<T,R> var_name = input_variables -> output_expression

thí dụ : Function<Double,Double> Sigmoid = x->(1/( 1 + Math.pow(Math.E,(-1*x))));

hoặc có một cách khác (còn được gọi là tham chiếu phương thức)

đây thực sự là truy cập vào phương thức ẩn

Function<T,R> var_name = class_name :: method_name

thí dụ : Function<Double,Double>Tanh = Math::tanh

Sử dụng một chức năng

Để sử dụng một hàm, bạn chỉ cần gọi apply(T t)phương thức của lớp hàm

thí dụ : double num = sigmoid.apply(0)