CodeGym /Blog Java /Ngẫu nhiên /Phương thức tính toán HashMap nếuAbsent() trong Java

Phương thức tính toán HashMap nếuAbsent() trong Java

Xuất bản trong nhóm
Java 8, như nhiều người trong chúng ta biết, đã giới thiệu Stream API. Đây là một bộ công cụ rất hữu ích, nhưng nó có một nhược điểm là nó không bao gồm Map s. Tuy nhiên, Java 8 đã thêm một số phương thức hữu ích vào chính giao diện Bản đồ để giảm số lượng mã "xấu". Vì vậy, nếu bạn cần thực hiện một số hành động với giá trị trong Bản đồ , nếu nó tồn tại trong đó, thì có một phương thức ComputeIfPresent() trong Bản đồ Java. Nếu bạn cần làm điều gì đó với một giá trị không có trong Map , bạn có thể sử dụng phương thức ComputeIfAbsent() . Chúng tôi sẽ xem xét nó trong bài viết này.

chữ ký phương thức computeIfAbsent()


default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)
Phương thức ComputeIfAbsent () Map (và HashMap ) nhận hai tham số. Tham số đầu tiên là khóa. Tham số thứ hai là mappingFunction . Trong phương pháp này, chức năng ánh xạ chỉ được gọi nếu ánh xạ không được trình bày.

Cách thức hoạt động của phương thức computeIfAbsent()

Như chúng ta đã biết, phương thức Map.computeIfAbsent() được truyền hai tham số là khóa và hàm tính giá trị cho khóa này mappingFunction . Đây là thuật toán logic của phương pháp:
  1. Trước tiên, phương thức này sẽ kiểm tra xem khóa đã truyền có được biểu thị trong Bản đồ của chúng tôi hay không .
  2. Nếu khóa được thể hiện trong Bản đồ (và nó không phải là null), thì phương thức này không làm gì cả.
  3. Khác nếu khóa không đại diện trong Bản đồ (hoặc không có giá trị), phương thức sẽ tính giá trị bằng cách sử dụng chức năng ánh xạ cho khóa.
  4. Nếu giá trị kết quả không phải là null, thì hãy viết một cặp khóa-giá trị để ánh xạ.
Hãy viết logic tương tự như mã:

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

ví dụ về mã computeIfAbsent()

Vì vậy, nếu giá trị không có trong Map thì phương thức sẽ thực hiện các thay đổi. Hãy xem một ví dụ đơn giản:

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"));
       }
}
Đầu ra là:
đây là chìa khóa của tôi, và đây là một giá trị mới
Bây giờ hãy xem phương thức sẽ làm gì khi có một giá trị nhất định trong Bản đồ . Cảnh báo spoiler: Nó sẽ không làm gì cả.

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"));
       }
}
Đây là đầu ra:
và đây là giá trị của tôi
Như bạn có thể thấy, giá trị vẫn không thay đổi.

Thêm một ví dụ về ComputeIfAbsent()

Nếu bạn đã quen thuộc với khái niệm bộ nhớ đệm, phương thức computeIfAbsent() có thể nhắc bạn nhớ đến điều gì đó. Hãy xem một ví dụ về phân tích cú pháp phức tạp hơn. Hãy gọi phương thức computeIfAbsent() hai lần để đảm bảo rằng trong trường hợp đầu tiên, giá trị thay đổi, trong khi ở trường hợp thứ hai thì không.

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

}
Đây là đầu ra:
phân tích cú pháp: 10 phân tích cú pháp: 25 10+25=35 phân tích cú pháp: 20 20+25=45 10+20=30
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION