Rujukan Kaedah di Jawa

1. Gambaran keseluruhan

Salah satu perubahan yang paling dialu-alukan di Java 8 adalah pengenalan ungkapan lambda, kerana ini memungkinkan kita untuk meninggalkan kelas tanpa nama, sangat mengurangkan kod plat boiler dan meningkatkan kebolehbacaan.

Rujukan kaedah adalah jenis ungkapan lambda khas . Mereka sering digunakan untuk membuat ungkapan lambda sederhana dengan merujuk kaedah yang ada.

Terdapat empat jenis rujukan kaedah:

  • Kaedah statik
  • Kaedah contoh objek tertentu
  • Kaedah contoh objek sewenang-wenang jenis tertentu
  • Pembina

Dalam tutorial ini, kita akan meneroka rujukan kaedah di Java.

2. Rujukan kepada Kaedah Statik

Kita akan mulakan dengan contoh yang sangat mudah, menggunakan huruf besar dan mencetak senarai Rentetan :

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

Kita dapat mencapainya dengan memanfaatkan ungkapan lambda sederhana yang memanggil kaedah StringUtils.capitalize () secara langsung:

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

Atau, kita boleh menggunakan rujukan kaedah untuk merujuk kepada kaedah statik huruf besar :

messages.forEach(StringUtils::capitalize);

Perhatikan bahawa rujukan kaedah selalu menggunakan :: operator.

3. Rujukan kepada Kaedah Instance Objek Khusus

Untuk menunjukkan jenis kaedah rujukan ini, mari kita 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 saiz bingkai basikal:

BicycleComparator bikeFrameSizeComparator = new BicycleComparator();

Kami boleh menggunakan ungkapan lambda untuk menyusun basikal mengikut ukuran bingkai, tetapi kami perlu menentukan dua basikal untuk perbandingan:

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

Sebagai gantinya, kita boleh menggunakan rujukan kaedah agar parameter pengendali penyusun lulus untuk kita:

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

Rujukan kaedah jauh lebih bersih dan lebih mudah dibaca, kerana niat kami jelas ditunjukkan oleh kodnya.

4. Rujukan kepada Kaedah Instance Objek Sukar Dari Jenis Tertentu

Jenis rujukan kaedah ini serupa dengan contoh sebelumnya, tetapi tanpa perlu membuat objek khusus untuk melakukan perbandingan.

Mari buat senarai Integer yang ingin kami susun:

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

Sekiranya kita menggunakan ungkapan lambda klasik, kedua-dua parameter perlu diteruskan secara eksplisit, sementara menggunakan rujukan kaedah jauh lebih mudah:

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

Walaupun ia masih satu jalur, rujukan kaedah jauh lebih mudah dibaca dan difahami.

5. Rujukan kepada Pembina

Kita boleh merujuk pembina dengan cara yang sama seperti kaedah statik dalam contoh pertama kita. Satu-satunya perbezaan ialah kita akan menggunakan kata kunci baru .

Mari buat susunan Basikal dari senarai String dengan jenama yang berbeza:

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

Pertama, kami akan menambah konstruktor baru ke kelas Basikal kami :

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

Seterusnya, kami akan menggunakan konstruktor baru kami dari rujukan kaedah dan membuat susunan Basikal dari senarai String yang asal :

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

Perhatikan bagaimana kita memanggil konstruktor Basikal dan Array menggunakan rujukan kaedah, memberikan kod kita penampilan yang lebih ringkas dan jelas.

6. Contoh dan Batasan Tambahan

Seperti yang telah kita lihat setakat ini, rujukan kaedah adalah kaedah terbaik untuk menjadikan kod dan niat kita sangat jelas dan mudah dibaca. Namun, kami tidak dapat menggunakannya untuk menggantikan semua jenis ungkapan lambda kerana mereka mempunyai beberapa batasan.

Batasan utama mereka adalah hasil daripada kekuatan terbesar mereka: output dari ungkapan sebelumnya perlu sepadan dengan parameter input dari tandatangan kaedah yang dirujuk .

Mari lihat contoh batasan ini:

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

Kes sederhana ini tidak dapat dinyatakan dengan referensi metode, kerana kaedah printf memerlukan 3 parameter dalam kasus kami, dan menggunakan createBicyclesList (). ForEach () hanya akan membenarkan kaedah merujuk untuk menyimpulkan satu parameter ( objek Sepeda ).

Akhirnya, mari kita terokai bagaimana membuat fungsi tanpa operasi yang dapat dirujuk dari ungkapan lambda.

Dalam kes ini, kita mahu menggunakan ungkapan lambda tanpa menggunakan parameternya.

Pertama, mari buat kaedah doNothingAtAll :

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

Oleh kerana ia adalah kaedah varargs, ia akan berfungsi dalam ungkapan lambda, tidak kira objek yang dirujuk atau jumlah parameter yang disimpulkan.

Sekarang, mari kita lihat dalam tindakan:

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

7. Kesimpulannya

Dalam tutorial ringkas ini, kami belajar apa rujukan kaedah di Java dan bagaimana menggunakannya untuk menggantikan ungkapan lambda, sehingga meningkatkan keterbacaan dan menjelaskan maksud pengaturcara.

Semua kod yang disajikan dalam artikel ini boleh didapati di GitHub.