CodeGym /Blog Java /rawak /Kaedah HashMap computeIfAbsent() dalam Java
John Squirrels
Tahap
San Francisco

Kaedah HashMap computeIfAbsent() dalam Java

Diterbitkan dalam kumpulan
Java 8, seperti yang kita ketahui, memperkenalkan API Strim. Ini adalah toolkit yang sangat berguna, tetapi ia mempunyai kelemahan, ia tidak termasuk Map s. Walau bagaimanapun, Java 8 menambah beberapa kaedah berguna pada antara muka Peta itu sendiri untuk mengurangkan jumlah kod "buruk". Jadi, jika anda perlu melakukan beberapa tindakan dengan nilai dalam Map , jika ia wujud di dalamnya, terdapat kaedah ComputeIfPresent() dalam Java Map. Jika anda perlu melakukan sesuatu dengan nilai yang tiada dalam Map , anda boleh menggunakan kaedah ComputeIfAbsent() . Kami akan mempertimbangkannya dalam artikel ini.

tandatangan kaedah computeIfAbsent().


default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)
Kaedah Map (dan HashMap ) computeIfAbsent () mengambil dua parameter. Parameter pertama adalah kunci. Parameter kedua ialah mappingFunction . Dalam kaedah ini fungsi pemetaan hanya dipanggil jika pemetaan tidak dibentangkan.

Cara kaedah computeIfAbsent() berfungsi

Seperti yang kita sedia maklum, kaedah Map.computeIfAbsent() diluluskan dua parameter, kunci dan fungsi untuk mengira nilai untuk pemetaanFunction kunci ini . Berikut ialah algoritma logik kaedah:
  1. Kaedah terlebih dahulu menyemak sama ada kunci yang diluluskan diwakili dalam Peta kami .
  2. Jika kunci diwakili dalam Peta (dan ia bukan batal), maka kaedah itu tidak melakukan apa-apa.
  3. Lain jika kunci tidak mewakili dalam Peta (atau ia batal) kaedah mengira nilai menggunakan mappingFunction kepada kunci.
  4. Jika nilai yang terhasil bukan nol, kemudian tulis pasangan nilai kunci untuk dipetakan.
Mari kita tulis logik yang sama seperti kod:

if (map.get(key) == null) 
{ 
V newValue = mappingFunction.apply(key); 
if (newValue != null) map.put(key, newValue); 
}

contoh kod computeIfAbsent().

Jadi, jika nilai tiada dalam Map , maka kaedah akan melakukan perubahan. Mari kita lihat contoh mudah:

import java.util.HashMap;
import java.util.Map;

//map.computeIfAbsent example 
public class ComputeIfAbsentExample {

       public static void main(String[] args) {

           Map<String, String> myMap = new HashMap<>();

           myMap.computeIfAbsent("here is my key", key -> key + ", " + "and this is a new value");

           System.out.println(myMap.get("here is my key"));
       }
}
Outputnya ialah:
inilah kunci saya, dan ini adalah nilai baharu
Sekarang mari lihat kaedah yang akan dilakukan apabila terdapat nilai yang diberikan dalam Peta . Makluman spoiler: Ia tidak akan melakukan apa-apa.

import java.util.HashMap;
import java.util.Map;

public class ComputeIfAbsentExample2 {

       public static void main(String[] args) {

           Map<String, String> myMap = new HashMap<>();
           myMap.put("here is my key", "and here is my value");

           myMap.computeIfAbsent("here is my key", key -> key + ", " + "and this is a new value");

           System.out.println(myMap.get("here is my key"));
       }
}
Berikut adalah outputnya:
dan inilah nilai saya
Seperti yang anda lihat, nilainya kekal tidak berubah.

Satu lagi contoh ComputeIfAbsent().

Jika anda sudah biasa dengan konsep caching, kaedah computeIfAbsent() mungkin mengingatkan anda tentang sesuatu. Mari kita lihat contoh penghuraian yang lebih kompleks. Mari kita panggil kaedah computeIfAbsent() dua kali untuk memastikan bahawa dalam kes pertama nilai berubah, manakala dalam kes kedua ia tidak.

import java.util.HashMap;
import java.util.Map;

public class ComputeIfAbsentExample {
   private static Map<String, Long> numbersMap = new HashMap<>();

   public static Long stringToLong(String str) {
       return numbersMap.computeIfAbsent(str, key -> {
           System.out.println("parsing: " + key);
           return Long.parseLong(key);
       });
   }

   public static void main(String[] args) {
       // will print:
       // > parsing: 10
       // > parsing: 25
       // > 10+25=35
       System.out.println("10+25=" + (stringToLong("10") + stringToLong("25")));
       // will print:
       // > parsing: 20
       // > 10+25=45
       // only "20" will be parsed this time, since "25" was already parsed and placed into `numbersMap` map before
       System.out.println("20+25=" + (stringToLong("20") + stringToLong("25")));
       // will print:
       // > 10+20=30
       // no parsing will occur, since both "10" and "20" were already parsed and placed into `numbersMap` map before
       System.out.println("10+20=" + (stringToLong("10") + stringToLong("20")));
   }

}
Berikut adalah outputnya:
menghurai: 10 menghurai: 25 10+25=35 menghurai: 20 20+25=45 10+20=30
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION