Operator Double Colon di Java 8

1. Ikhtisar

Dalam artikel singkat ini, kita akan membahas operator titik dua ganda ( ::) di Java 8 dan membahas skenario di mana operator dapat digunakan.

2. Dari Lambdas ke Double Colon Operator

Dengan ekspresi Lambdas, kami telah melihat bahwa kode bisa menjadi sangat ringkas.

Misalnya, untuk membuat komparator , sintaks berikut sudah cukup:

Comparator c = (Computer c1, Computer c2) -> c1.getAge().compareTo(c2.getAge()); 

Kemudian, dengan jenis inferensi:

Comparator c = (c1, c2) -> c1.getAge().compareTo(c2.getAge());

Tetapi dapatkah kita membuat kode di atas lebih ekspresif dan mudah dibaca? Mari kita lihat:

Comparator c = Comparator.comparing(Computer::getAge); 

Kami telah menggunakan :: operator sebagai singkatan dari lambda memanggil metode tertentu - dengan nama. Dan akhirnya, hasilnya tentu saja sintaksnya lebih terbaca.

3. Bagaimana cara kerjanya?

Sederhananya, ketika kita menggunakan referensi metode - referensi target ditempatkan sebelum pembatas :: dan nama metode diberikan setelahnya.

Sebagai contoh:

Computer::getAge;

Kami melihat referensi metode ke metode getAge yang ditentukan di kelas Komputer .

Kami kemudian dapat beroperasi dengan fungsi itu:

Function getAge = Computer::getAge; Integer computerAge = getAge.apply(c1); 

Perhatikan bahwa kita mereferensikan fungsinya - lalu menerapkannya ke jenis argumen yang tepat.

4. Referensi Metode

Kami dapat memanfaatkan operator ini dengan baik dalam beberapa skenario.

4.1. Metode Statis

Pertama, kita akan menggunakan metode utilitas statis :

List inventory = Arrays.asList( new Computer( 2015, "white", 35), new Computer(2009, "black", 65)); inventory.forEach(ComputerUtils::repair); 

4.2. Metode Instance dari Objek yang Ada

Selanjutnya, mari kita lihat skenario yang menarik - mereferensikan metode dari instance objek yang ada .

Kami akan menggunakan Sistem variabel . out - objek berjenis PrintStream yang mendukung metode 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. Metode Instance dari Objek Sewenang-wenang 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 mereferensikan metode turnOnPc bukan pada instance tertentu, tetapi pada tipe itu sendiri.

Pada baris 4, metode instance turnOnPc akan dipanggil untuk setiap objek inventaris .

Dan ini secara alami berarti bahwa - untuk c1 metode turnOnPc akan dipanggil pada instans Komputer dan untuk c2 pada instans MacbookPro .

4.4. Metode Super dari Objek Tertentu

Misalkan Anda memiliki metode berikut di superclass Komputer :

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 calculateValue metode pada MacbookPro contoh:

macbookPro.calculateValue(999.99); 

juga akan menghasilkan panggilan untuk menghitung nilai pada superkelas Komputer .

5. Referensi Pembina

5.1. Buat Instance Baru

Merujuk konstruktor untuk membuat instance objek bisa sangat sederhana:

@FunctionalInterface public interface InterfaceComputer { Computer create(); } InterfaceComputer c = Computer::new; Computer computer = c.create(); 

Bagaimana jika Anda memiliki dua parameter dalam konstruktor?

BiFunction c4Function = Computer::new; Computer c4 = c4Function.apply(2013, "white"); 

Jika parameter tiga atau lebih, Anda harus menentukan antarmuka 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, inisialisasi objek Anda:

TriFunction  c6Function = Computer::new; Computer c3 = c6Function.apply(2008, "black", 90); 

5.2. Buat Array

Terakhir, mari kita lihat cara membuat array objek Komputer dengan lima elemen:

Function  computerCreator = Computer[]::new; Computer[] computerArray = computerCreator.apply(5); 

6. Kesimpulan

Seperti yang mulai kita lihat, operator titik dua ganda - diperkenalkan di Java 8 - akan sangat berguna dalam beberapa skenario, dan terutama dalam hubungannya dengan Stream.

Sangat penting juga untuk melihat antarmuka fungsional untuk pemahaman yang lebih baik tentang apa yang terjadi di balik layar.

Kode sumber lengkap untuk contoh tersedia dalam proyek GitHub ini - ini adalah proyek Maven dan Eclipse sehingga dapat diimpor dan digunakan sebagaimana adanya.