CodeGym /Java Blogu /Rastgele /Java'da HashMap computeIfAbsent() yöntemi
John Squirrels
Seviye
San Francisco

Java'da HashMap computeIfAbsent() yöntemi

grupta yayınlandı
Çoğumuzun bildiği gibi Java 8, Stream API'yi tanıttı. Bu çok kullanışlı bir araç seti, ancak bir dezavantajı var, Map s içermiyor . Ancak Java 8, "kötü" kod miktarını azaltmak için Harita arabiriminin kendisine birkaç yararlı yöntem ekledi. Bu nedenle, Map içindeki değerle bazı eylemler gerçekleştirmeniz gerekirse , eğer içinde varsa, Java Haritasında bir ComputeIfPresent() yöntemi vardır. Map içinde olmayan bir değerle bir şey yapmanız gerekirse ComputeIfAbsent() yöntemini kullanabilirsiniz . Bu yazıda ele alacağız.

computeIfAbsent() yöntemi imzası


default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)
Map (ve HashMap ) computeIfAbsent () yöntemi iki parametre alır. İlk parametre anahtardır. İkinci parametre, mappingFunction'dır . Bu yöntemde, eşleme işlevi yalnızca eşleme sunulmazsa çağrılır.

computeIfAbsent() yöntemi nasıl çalışır?

Bildiğimiz gibi, Map.computeIfAbsent() yöntemine iki parametre iletilir, anahtar ve bu anahtar için değer hesaplama işlevi mappingFunction . İşte yöntemin mantıksal algoritması:
  1. Yöntem ilk olarak, geçirilen anahtarın Haritamızda temsil edilip edilmediğini kontrol eder .
  2. Anahtar, Harita'da temsil ediliyorsa ( ve boş değilse), yöntem hiçbir şey yapmaz.
  3. Aksi takdirde, anahtar Harita'da temsil edilmiyorsa ( veya boşsa), yöntem, anahtara mappingFunction kullanarak değeri hesaplar.
  4. Ortaya çıkan değer null değilse, eşlemek için bir anahtar/değer çifti yazın.
Aynı mantığı kod olarak yazalım:

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

computeIfAbsent() kod örneği

Dolayısıyla, değer Map içinde değilse , yöntem değişiklikleri gerçekleştirecektir. Basit bir örneğe bakalım:

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"));
       }
}
Çıktı:
işte anahtarım ve bu yeni bir değer
Şimdi, Map içinde belirli bir değer olduğunda yöntemin ne yapacağına bakalım . Spoiler uyarısı: Hiçbir şey yapmayacak.

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"));
       }
}
İşte çıktı:
ve işte benim değerim
Gördüğünüz gibi, değer değişmeden kalır.

Bir ComputeIfAbsent() örneği daha

Önbelleğe alma kavramına aşina iseniz, computeIfAbsent() yöntemi muhtemelen size bir şeyler hatırlatır. Daha karmaşık bir ayrıştırma örneğine bir göz atalım. İlk durumda değerin değişip ikinci durumda değişmediğinden emin olmak için computeIfAbsent() yöntemini iki kez çağıralım .

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")));
   }

}
İşte çıktı:
ayrıştırma: 10 ayrıştırma: 25 10+25=35 ayrıştırma: 20 20+25=45 10+20=30
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION