Referensi Metode di Java

1. Ikhtisar

Salah satu perubahan yang paling diterima di Java 8 adalah pengenalan ekspresi lambda, karena ini memungkinkan kita untuk mengabaikan kelas anonim, sangat mengurangi kode boilerplate dan meningkatkan keterbacaan.

Referensi metode adalah tipe khusus dari ekspresi lambda . Mereka sering digunakan untuk membuat ekspresi lambda sederhana dengan mereferensikan metode yang ada.

Ada empat macam referensi metode:

  • Metode statis
  • Metode contoh objek tertentu
  • Metode instance dari objek arbitrer dari jenis tertentu
  • Pembuat

Dalam tutorial ini, kita akan menjelajahi referensi metode di Java.

2. Referensi ke Metode Statis

Kami akan mulai dengan contoh yang sangat sederhana, memanfaatkan dan mencetak daftar String :

List messages = Arrays.asList("hello", "baeldung", "readers!");

Kita bisa mencapai ini dengan memanfaatkan ekspresi lambda sederhana yang memanggil metode StringUtils.capitalize () secara langsung:

messages.forEach(word -> StringUtils.capitalize(word));

Atau, kita dapat menggunakan referensi metode untuk merujuk ke metode statis kapitalisasi :

messages.forEach(StringUtils::capitalize);

Perhatikan bahwa referensi metode selalu menggunakan :: operator.

3. Referensi ke Metode Instance dari Objek Tertentu

Untuk mendemonstrasikan jenis referensi metode ini, mari pertimbangkan dua kelas:

public class Bicycle { private String brand; private Integer frameSize; // standard constructor, getters and setters } public class BicycleComparator implements Comparator { @Override public int compare(Bicycle a, Bicycle b) { return a.getFrameSize().compareTo(b.getFrameSize()); } }

Dan, mari buat objek BicycleComparator untuk membandingkan ukuran rangka sepeda:

BicycleComparator bikeFrameSizeComparator = new BicycleComparator();

Kita dapat menggunakan ekspresi lambda untuk mengurutkan sepeda berdasarkan ukuran bingkai, tetapi kita perlu menentukan dua sepeda untuk perbandingan:

createBicyclesList().stream() .sorted((a, b) -> bikeFrameSizeComparator.compare(a, b));

Sebagai gantinya, kita dapat menggunakan referensi metode agar parameter compiler menangani melewati kita:

createBicyclesList().stream() .sorted(bikeFrameSizeComparator::compare);

Referensi metode jauh lebih bersih dan lebih mudah dibaca, karena maksud kami dengan jelas ditunjukkan oleh kode.

4. Referensi ke Metode Instance dari Objek Sewenang-wenang dari Jenis Tertentu

Jenis referensi metode ini mirip dengan contoh sebelumnya, tetapi tanpa harus membuat objek khusus untuk melakukan perbandingan.

Mari buat daftar Integer yang ingin kita sortir:

List numbers = Arrays.asList(5, 3, 50, 24, 40, 2, 9, 18);

Jika kita menggunakan ekspresi lambda klasik, kedua parameter harus diteruskan secara eksplisit, sementara referensi metode jauh lebih mudah:

numbers.stream() .sorted((a, b) -> a.compareTo(b)); numbers.stream() .sorted(Integer::compareTo);

Meskipun masih satu baris, referensi metode jauh lebih mudah dibaca dan dipahami.

5. Referensi ke Konstruktor

Kita bisa mereferensikan konstruktor dengan cara yang sama seperti kita mereferensikan metode statis dalam contoh pertama kita. Satu-satunya perbedaan adalah kami akan menggunakan kata kunci baru .

Mari buat deretan Sepeda dari daftar String dengan merek berbeda:

List bikeBrands = Arrays.asList("Giant", "Scott", "Trek", "GT");

Pertama, kami akan menambahkan konstruktor baru ke kelas Sepeda kami :

public Bicycle(String brand) { this.brand = brand; this.frameSize = 0; } 

Selanjutnya, kita akan menggunakan konstruktor baru kita dari referensi metode dan membuat larik Sepeda dari daftar String asli :

bikeBrands.stream() .map(Bicycle::new) .toArray(Bicycle[]::new); 

Perhatikan bagaimana kami memanggil konstruktor Sepeda dan Array menggunakan referensi metode, memberikan kode kami tampilan yang jauh lebih ringkas dan jelas.

6. Contoh dan Batasan Tambahan

Seperti yang telah kita lihat sejauh ini, referensi metode adalah cara yang bagus untuk membuat kode dan maksud kita sangat jelas dan dapat dibaca. Namun, kami tidak dapat menggunakannya untuk mengganti semua jenis ekspresi lambda karena memiliki beberapa batasan.

Batasan utama mereka adalah hasil dari kekuatan terbesar mereka: keluaran dari ekspresi sebelumnya harus cocok dengan parameter masukan dari tanda tangan metode yang direferensikan .

Mari kita lihat contoh batasan ini:

createBicyclesList().forEach(b -> System.out.printf( "Bike brand is '%s' and frame size is '%d'%n", b.getBrand(), b.getFrameSize()));

Kasus sederhana ini tidak dapat diekspresikan dengan referensi metode, karena metode printf memerlukan 3 parameter dalam kasus kita, dan menggunakan createBicyclesList (). ForEach () hanya akan memungkinkan referensi metode menyimpulkan satu parameter ( objek Sepeda ).

Terakhir, mari kita jelajahi cara membuat fungsi tanpa operasi yang bisa direferensikan dari ekspresi lambda.

Dalam kasus ini, kami ingin menggunakan ekspresi lambda tanpa menggunakan parameternya.

Pertama, mari buat metode doNothingAtAll :

private static  void doNothingAtAll(Object... o) { }

Karena ini adalah metode varargs, ini akan bekerja dalam ekspresi lambda apa pun, tidak peduli objek yang direferensikan atau jumlah parameter yang disimpulkan.

Sekarang, mari kita lihat aksinya:

createBicyclesList() .forEach((o) -> MethodReferenceExamples.doNothingAtAll(o)); 

7. Kesimpulan

Dalam tutorial singkat ini, kita mempelajari referensi metode apa yang ada di Java dan bagaimana menggunakannya untuk menggantikan ekspresi lambda, sehingga meningkatkan keterbacaan dan memperjelas maksud pemrogram.

Semua kode yang disajikan dalam artikel ini tersedia di GitHub.