1. Metode fungsi

Yen antarmuka mung nduweni siji cara , variabel saka jinis antarmuka kasebut bisa diwenehi nilai sing diwenehake dening ekspresi lambda (fungsi lambda). Antarmuka kasebut dikenal minangka antarmuka fungsional (sawise Jawa nambahake dhukungan kanggo fungsi lambda).

Contone, Jawa nduweni antarmuka Consumer<Type>, sing nduweni accept(Type obj)metode. Napa antarmuka iki dibutuhake?

Ing Jawa 8, koleksi duwe metode, singforEach() ngidini sampeyan nindakake sawetara tumindak kanggo saben unsur koleksi . Lan ing kene antarmuka fungsional digunakake kanggo ngirim tumindak menyang metode kasebut.Consumer<T>forEach()

Mangkene carane sampeyan bisa nampilake kabeh unsur koleksi :

ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "Hello", "how's", "life?");

list.forEach( (s) -> System.out.println(s) );
Nampilake kabeh unsur koleksi (nggunakake ekspresi lambda)

Compiler bakal ngowahi kode ing ndhuwur dadi kode ing ngisor iki:

ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "Hello", "how's", "life?");

list.forEach(new Consumer<String>()
{
   public void accept(String s)
   {
      System.out.println(s));
   }
});
Nampilake kabeh unsur koleksi (nggunakake kelas anonim)

Versi pisanan mesthi luwih cendhek tinimbang sing kapindho. Lan nalika kode karo ekspresi lambda angel diwaca, kode karo kelas batin anonim kadhangkala luwih angel diwaca.



2. Referensi metode

Nanging, kode ekspresi lambda kita bisa ditulis luwih cendhek.

Pisanan, sampeyan bisa ngilangi tanda kurung ing sekitar sparameter:

list.forEach( (s) -> System.out.println(s) );
sadurunge
list.forEach( s -> System.out.println(s) );
Sawise

Iki mung bisa ditindakake yen ana siji parameter . Yen ana pirang-pirang parameter, mula sampeyan kudu nggunakake tanda kurung .

Lan kapindho, sampeyan bisa nulis kaya iki:

list.forEach( System.out::println );
Notasi paling kompak

Iki minangka notasi sing padha. Elinga yen ora ana tanda kurung sawise println.

Ing kene kita duwe kode sing padha - telpon metode:

object::method
x -> object.method(x)

Coba pikirake: kita pengin nindakake sawetara tumindak kanggo saben unsur koleksi list. Yen tumindak iku telpon fungsi siji (kayata println()), banjur nggawe raos mung pass fungsi kanggo cara minangka parameter.

Nanging kepiye carane nerangake kompiler yen kita pengin ngliwati metode kasebut tinimbang nelpon? Kanggo nindakake iki, tinimbang operator titik, kita nggunakake rong titik loro sadurunge jeneng metode. Titik titik siji wis digunakake kanggo nunjukake operator ternary.

Iki minangka notasi sing paling gampang lan kompak.



3. Konstruktor

Referensi metode kanthi titik loro banget migunani nalika kita nggarap aliran I / O. Sampeyan bakal weruh iki sethitik mengko.

Ing sawetoro wektu, ayo ngomong babagan 3 cara populer kanggo ngliwati referensi metode:

Referensi kanggo metode obyek

Kanggo ngliwati referensi menyang metode obyek, sampeyan kudu nulis kaya . Kode iki padha karo .object::method
x -> object.method(x)

Khusus thislan supervariabel bisa digunakake minangka obyek.

Referensi kanggo metode kelas

Kanggo ngliwati referensi menyang cara statis, sampeyan kudu nulis kaya . Kode iki bakal diowahi dadi kode kayaclass::methodx -> class.method(x);

Referensi kanggo konstruktor

A konstruktor tumindak padha kanggo cara kelas statis, supaya sampeyan uga bisa pass referensi kanggo konstruktor a. Iki carane katon: .class::new

Contone, sampeyan bisa ngubengi jinis erasure kanggo koleksi lan ngliwati metode toArray()referensi menyang konstruktor sing bakal nggawe array sing dikarepake:toArray(int[]::new);