1. Gambaran keseluruhan
Dalam artikel ringkas ini, kita akan membincangkan pengendali kolon dua (: :) di Java 8 dan membahas senario di mana pengendali dapat digunakan.
2. Dari Lambdas ke Operator Colon Berkembar
Dengan ungkapan Lambdas, kami telah melihat bahawa kod boleh menjadi sangat ringkas.
Contohnya, untuk membuat pembanding , sintaks berikut cukup:
Comparator c = (Computer c1, Computer c2) -> c1.getAge().compareTo(c2.getAge());
Kemudian, dengan inferens jenis:
Comparator c = (c1, c2) -> c1.getAge().compareTo(c2.getAge());
Tetapi bolehkah kita membuat kod di atas lebih ekspresif dan mudah dibaca? Mari kita lihat:
Comparator c = Comparator.comparing(Computer::getAge);
Kami telah menggunakan :: operator sebagai singkatan untuk lambdas memanggil kaedah tertentu - dengan nama. Dan akhirnya, hasilnya tentu saja merupakan sintaks yang lebih mudah dibaca.
3. Bagaimana Ia Berfungsi?
Sederhananya, ketika kita menggunakan rujukan kaedah - rujukan sasaran diletakkan di hadapan pembatas :: dan nama kaedah diberikan setelahnya.
Sebagai contoh:
Computer::getAge;
Kami sedang melihat kaedah merujuk kepada kaedah getAge yang ditentukan dalam kelas Komputer .
Kita kemudian boleh beroperasi dengan fungsi itu:
Function getAge = Computer::getAge; Integer computerAge = getAge.apply(c1);
Perhatikan bahawa kita merujuk fungsi - dan kemudian menerapkannya pada jenis argumen yang betul.
4. Rujukan Kaedah
Kami dapat memanfaatkan pengendali ini dengan baik dalam beberapa senario.
4.1. Kaedah Statik
Pertama, kita akan menggunakan kaedah utiliti statik :
List inventory = Arrays.asList( new Computer( 2015, "white", 35), new Computer(2009, "black", 65)); inventory.forEach(ComputerUtils::repair);
4.2. Kaedah Contoh Objek yang Ada
Seterusnya, mari lihat senario menarik - merujuk kaedah contoh objek yang ada .
Kami akan menggunakan Sistem pemboleh ubah . keluar - objek jenis PrintStream yang menyokong kaedah cetak :
Computer c1 = new Computer(2015, "white"); Computer c2 = new Computer(2009, "black"); Computer c3 = new Computer(2014, "black"); Arrays.asList(c1, c2, c3).forEach(System.out::print);
4.3. Kaedah Contoh Objek Sukar Dari Jenis Tertentu
Computer c1 = new Computer(2015, "white", 100); Computer c2 = new MacbookPro(2009, "black", 100); List inventory = Arrays.asList(c1, c2); inventory.forEach(Computer::turnOnPc);
Seperti yang anda lihat, kami merujuk kaedah turnOnPc bukan pada contoh tertentu, tetapi pada jenis itu sendiri.
Pada baris 4 kaedah instance turnOnPc akan dipanggil untuk setiap objek inventori .
Dan ini secara semula jadi bermaksud bahawa - untuk c1 kaedah turnOnPc akan dipanggil pada contoh Komputer dan untuk c2 pada contoh MacbookPro .
4.4. Kaedah Super Objek Khusus
Katakan anda mempunyai kaedah berikut dalam komputer superkelas:
public Double calculateValue(Double initialValue) { return initialValue/1.50; }
dan yang ini di subkelas MacbookPro :
@Override public Double calculateValue(Double initialValue){ Function function = super::calculateValue; Double pcValue = function.apply(initialValue); return pcValue + (initialValue/10) ; }
Panggilan untuk mengira kaedah Nilai pada contoh MacbookPro :
macbookPro.calculateValue(999.99);
juga akan menghasilkan panggilan untuk mengira Nilai pada superclass Komputer .
5. Rujukan Pembina
5.1. Buat Contoh Baru
Merujuk konstruktor untuk membuat objek boleh menjadi sangat mudah:
@FunctionalInterface public interface InterfaceComputer { Computer create(); } InterfaceComputer c = Computer::new; Computer computer = c.create();
Bagaimana jika anda mempunyai dua parameter dalam konstruktor?
BiFunction c4Function = Computer::new; Computer c4 = c4Function.apply(2013, "white");
Sekiranya parameter adalah tiga atau lebih, anda harus menentukan antara muka Fungsional baru:
@FunctionalInterface interface TriFunction { R apply(A a, B b, C c); default TriFunction andThen( Function after) { Objects.requireNonNull(after); return (A a, B b, C c) -> after.apply(apply(a, b, c)); } }
Kemudian, mulakan objek anda:
TriFunction c6Function = Computer::new; Computer c3 = c6Function.apply(2008, "black", 90);
5.2. Buat Array
Akhirnya, mari kita lihat bagaimana membuat pelbagai objek Komputer dengan lima elemen:
Function computerCreator = Computer[]::new; Computer[] computerArray = computerCreator.apply(5);
6. Kesimpulannya
Seperti yang telah kita lihat, pengendali kolon dua - diperkenalkan di Java 8 - akan sangat berguna dalam beberapa senario, dan terutama bersama dengan Stream.
Juga sangat penting untuk melihat antara muka fungsional untuk pemahaman yang lebih baik tentang apa yang berlaku di belakang tabir.
Kod sumber lengkap untuk contoh boleh didapati dalam projek GitHub ini - ini adalah projek Maven dan Eclipse sehingga dapat diimport dan digunakan sebagaimana adanya.