Apa antarmuka fungsional Java 8 untuk metode yang tidak mengambil apa pun dan tidak mengembalikan apa pun?
Yaitu, setara dengan C # parameterless Action
dengan void
tipe kembali?
Apa antarmuka fungsional Java 8 untuk metode yang tidak mengambil apa pun dan tidak mengembalikan apa pun?
Yaitu, setara dengan C # parameterless Action
dengan void
tipe kembali?
Jawaban:
Jika saya mengerti dengan benar Anda menginginkan antarmuka fungsional dengan metode void m()
. Dalam hal ini Anda cukup menggunakan file Runnable
.
Runnable
dianotasi dengan @FunctionalInterface
dan (ii) bahkan dalam konteks ekspresi lambda itu akan dieksekusi pada utas: utas di mana lambda dijalankan yang mungkin utas saat ini ...
Runnable
itu dimaksudkan untuk digunakan untuk tujuan ini, bukan hanya untuk memasukkan konteks.
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
@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:::
Runnable
Spesifikasi antarmuka menunjukkan itu adalah untuk memberikan kode yang dapat dieksekusi keThread
kelas. Tampaknya tidak benar bagi saya untuk menggunakanRunnable
yang tidak dimaksudkan untuk dieksekusi oleh utas; sepertinya menyesatkan.Runnable
didefinisikan sebagaiFunctionalInterface
karena memenuhi spesifikasi antarmuka fungsional dan dapat dibuat menggunakan sintaks lambda. Mengapa tidak membuat antarmuka fungsional Anda sendiri? lihat Runnable , lihat FunctionalInterface