Antarmuka fungsional Java 8 tanpa argumen dan tanpa nilai balik

110

Apa antarmuka fungsional Java 8 untuk metode yang tidak mengambil apa pun dan tidak mengembalikan apa pun?

Yaitu, setara dengan C # parameterless Actiondengan voidtipe kembali?

Miguel Gamboa
sumber

Jawaban:

97

Jika saya mengerti dengan benar Anda menginginkan antarmuka fungsional dengan metode void m(). Dalam hal ini Anda cukup menggunakan file Runnable.

assylias
sumber
29
RunnableSpesifikasi antarmuka menunjukkan itu adalah untuk memberikan kode yang dapat dieksekusi ke Threadkelas. Tampaknya tidak benar bagi saya untuk menggunakan Runnableyang tidak dimaksudkan untuk dieksekusi oleh utas; sepertinya menyesatkan. Runnabledidefinisikan sebagai FunctionalInterfacekarena memenuhi spesifikasi antarmuka fungsional dan dapat dibuat menggunakan sintaks lambda. Mengapa tidak membuat antarmuka fungsional Anda sendiri? lihat Runnable , lihat FunctionalInterface
TheSecretSquad
6
@TheSecretSquad (i) Runnabledianotasi dengan @FunctionalInterfacedan (ii) bahkan dalam konteks ekspresi lambda itu akan dieksekusi pada utas: utas di mana lambda dijalankan yang mungkin utas saat ini ...
assylias
9
Saya setuju dengan @TheSecretSquad, meskipun memenuhi persyaratan fungsional, kedengarannya tidak terlalu semantik, Runnable biasanya dikaitkan dengan pembuatan utas. Antarmuka fungsional Pekerja yang sederhana dengan metode doWork akan menyenangkan. EDIT: Ups: stackoverflow.com/questions/27973294/…
jpangamarca
6
Fleshing out @ jpangamarca's "Ups" di atas: Dalam komentar pada pertanyaan duplikat yang dia tautkan, Brian Goetz mengonfirmasi bahwa Runnableitu dimaksudkan untuk digunakan untuk tujuan ini, bukan hanya untuk memasukkan konteks.
Joshua Goldberg
10
Mengingat itu masalahnya, saya pikir javadoc harus dibuat lebih umum: docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html
Joshua Goldberg
15

Buat saja sendiri

@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();
        };
    }
}

dan gunakan seperti ini

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();

}

dan hasilnya

HelloWorld
WorldHello
Charana
sumber
Saya benar-benar merasa, mengingat etos pertanyaannya, bahwa ini harus menjadi jawaban yang diterima.
corsiKa
0

@FunctionalInterface hanya mengizinkan metode abstrak metode Karenanya Anda dapat membuat instance antarmuka itu dengan ekspresi lambda seperti di bawah ini dan Anda dapat mengakses anggota antarmuka

        @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:::
uma mahesh
sumber