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?

Jawaban:


97

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


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

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:::
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.