Kaedah Map.computeIfAbsent ()

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan melihat secara ringkas pada baru kaedah lalai computeIfAbsent daripada Peta muka diperkenalkan di Jawa 8.

Secara khusus, kami akan melihat tanda tangan, penggunaannya, dan bagaimana ia menangani pelbagai kes.

2. Kaedah Map.computeIfAbsent

Mari mulakan dengan melihat tandatangan computeIfAbsent :

default V computeIfAbsent(K key, Function mappingFunction)

The computeIfAbsent kaedah mengambil dua parameter. Parameter pertama adalah kunci dan parameter kedua adalah fungsi pemetaan. Penting untuk mengetahui bahawa fungsi pemetaan hanya dipanggil jika pemetaan tidak ada.

2.1. Kunci Berkaitan dengan Nilai Tidak Nol

Pertama, ia memeriksa sama ada kunci ada dalam peta. Sekiranya kunci ada dan nilai tidak kosong berkaitan dengan kunci, maka ia mengembalikan nilai itu:

Map stringLength = new HashMap(); stringLength.put("John", 5); assertEquals((long)stringLength.computeIfAbsent("John", s -> s.length()), 5);

Seperti yang kita lihat, kunci "John" memiliki pemetaan non-nol, ia mengembalikan nilai 5. Jika fungsi pemetaan kita digunakan, kita mengharapkan fungsi tersebut akan mengembalikan panjang 4.

2.2. Menggunakan Fungsi Pemetaan untuk Mengira Nilai

Selanjutnya, jika kunci tidak ada di peta atau nilai nol berkaitan dengan kunci, maka ia berusaha untuk menghitung nilai menggunakan fungsi pemetaan yang diberikan . Ia juga memasukkan nilai yang dikira ke dalam peta kecuali jika nilai yang dikira adalah nol.

Mari lihat penggunaan pemetaanFungsi dalam kaedah computeIfAbsent :

Map stringLength = new HashMap(); assertEquals((long)stringLength.computeIfAbsent("John", s -> s.length()), 4); assertEquals((long)stringLength.get("John"), 4);

Oleh kerana kunci "John" tidak ada, ia menghitung nilainya dengan meneruskan kunci sebagai parameter ke fungsi pemetaan .

2.3. Fungsi Pemetaan Mengembalikan nol

Juga, jika fungsi pemetaan mengembalikan nol , peta tidak mencatat pemetaan:

Map stringLength = new HashMap(); assertEquals(stringLength.computeIfAbsent("John", s -> null), null); assertNull(stringLength.get("John"));

2.4. Fungsi Pemetaan Melemparkan Pengecualian

Akhirnya, jika pemetaanFungsi membuang pengecualian yang tidak dicentang , pengecualian dilemparkan semula, dan peta tidak mencatatkan pemetaan:

@Test(expected = RuntimeException.class) public void whenMappingFunctionThrowsException_thenExceptionIsRethrown() { Map stringLength = new HashMap(); stringLength.computeIfAbsent("John", s -> { throw new RuntimeException(); }); }

Kami melihat bahawa pemetaanFungsi melemparkan RuntimeException , yang menyebarkan kembali ke kaedah computeIfAbsent .

3. Kesimpulannya

Dalam artikel ringkas ini, kami melihat kaedah computeIfAbsent , tandatangannya, dan penggunaannya. Akhirnya, kami melihat bagaimana menangani pelbagai kes.

Seperti biasa, semua contoh kod ini terdapat di GitHub.