Giao diện chức năng Java 8 không có đối số và không có giá trị trả về


109

Giao diện chức năng Java 8 cho một phương thức không mất gì và không trả về gì?

Tức là, tương đương với C # không có tham số Actionvới voidkiểu trả về?

Câu trả lời:


96

Nếu tôi hiểu chính xác, bạn muốn có một giao diện chức năng với một phương thức void m(). Trong trường hợp đó, bạn có thể chỉ cần sử dụng a Runnable.


29
RunnableĐặc tả giao diện của chỉ ra rằng nó là để cung cấp mã thực thi cho Threadlớp. Đối với tôi, có vẻ không đúng khi sử dụng Runnablenó ở nơi không dành cho việc thực thi bởi một luồng; có vẻ gây hiểu lầm. Runnableđược định nghĩa là a FunctionalInterfacevì nó đáp ứng đặc điểm kỹ thuật của giao diện chức năng và có thể được tạo bằng cú pháp lambda. Tại sao không tạo giao diện chức năng của riêng bạn? xem Runnable , xem FunctionInterface
TheSecretSquad

6
@TheSecretSquad (i) Runnableđược chú thích bằng @FunctionalInterfacevà (ii) ngay cả trong ngữ cảnh của biểu thức lambda, nó sẽ được thực thi trên một luồng: luồng mà lambda đang chạy có thể là luồng hiện tại ...
assylias

9
Tôi đồng ý với @TheSecretSquad, mặc dù nó đáp ứng yêu cầu chức năng nhưng nghe có vẻ không hợp ngữ nghĩa lắm, Runnable thường được kết hợp với việc tạo các luồng. Một giao diện chức năng Worker đơn giản với phương thức doWork sẽ rất hay. CHỈNH SỬA: Rất tiếc: stackoverflow.com/questions/27973294/…
jpangamarca

6
Tìm hiểu "Rất tiếc" của @ jpangamarca ở trên: Trong các nhận xét về câu hỏi trùng lặp mà anh ấy đã liên kết, Brian Goetz xác nhận rằng câu hỏi đó Runnableđược sử dụng cho mục đích này, không chỉ để phân luồng ngữ cảnh.
Joshua Goldberg,

10
Tuy nhiên, vì đó là trường hợp, tôi nghĩ javadoc nên được tạo ra chung chung hơn: docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html
Joshua Goldberg.

15

Chỉ cần làm của riêng bạn

@FunctionalInterface
public interface Procedure {
    void run();

    default Procedure andThen(Procedure after){
        return () -> {
            this.run();
            after.run();
        };
    }

    default Procedure compose(Procedure before){
        return () -> {
            before.run();
            this.run();
        };
    }
}

và sử dụng nó như thế này

public static void main(String[] args){
    Procedure procedure1 = () -> System.out.print("Hello");
    Procedure procedure2 = () -> System.out.print("World");

    procedure1.andThen(procedure2).run();
    System.out.println();
    procedure1.compose(procedure2).run();

}

và đầu ra

HelloWorld
WorldHello

Tôi thực sự cảm thấy, với đặc điểm của câu hỏi, rằng đây phải là câu trả lời được chấp nhận.
corsiKa

0

@F FunctionInterface chỉ cho phép phương thức trừu tượng do đó bạn có thể khởi tạo giao diện đó bằng biểu thức lambda như bên dưới và bạn có thể truy cập các thành viên giao diện

        @FunctionalInterface
        interface Hai {

            void m2();

            static void m1() {
                System.out.println("i m1 method:::");
            }

            default void log(String str) {
                System.out.println("i am log method:::" + str);
            }

        }

    public class Hello {
        public static void main(String[] args) {

            Hai hai = () -> {};
            hai.log("lets do it.");
            Hai.m1();

        }
    }


output:
i am log method:::lets do it.
i m1 method:::
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.