CodeGym /Java Blog /๋ฌด์ž‘์œ„์˜ /Java์˜ HashMap computeIfAbsent() ๋ฉ”์„œ๋“œ
John Squirrels
๋ ˆ๋ฒจ 41
San Francisco

Java์˜ HashMap computeIfAbsent() ๋ฉ”์„œ๋“œ

๋ฌด์ž‘์œ„์˜ ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์•Œ๊ณ  ์žˆ๋“ฏ์ด Java 8์€ Stream API๋ฅผ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งค์šฐ ์œ ์šฉํ•œ ํˆดํ‚ท์ด์ง€๋งŒ Map ์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค . ๊ทธ๋Ÿฌ๋‚˜ Java 8์€ "์ž˜๋ชป๋œ" ์ฝ”๋“œ์˜ ์–‘์„ ์ค„์ด๊ธฐ ์œ„ํ•ด Map ์ธํ„ฐํŽ˜์ด์Šค ์ž์ฒด์— ๋ช‡ ๊ฐ€์ง€ ์œ ์šฉํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Map ์— ์žˆ๋Š” ๊ฐ’์œผ๋กœ ์–ด๋–ค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ Java Map์— ComputeIfPresent() ๋ฉ”์„œ๋“œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค . Map ์— ์—†๋Š” ๊ฐ’์œผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ComputeIfAbsent() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ์ด ๊ธฐ์‚ฌ์—์„œ ๊ณ ๋ คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

computeIfAbsent() ๋ฉ”์„œ๋“œ ์„œ๋ช…


default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)
Map (๋ฐ HashMap ) computeIfAbsent () ๋ฉ”์„œ๋“œ๋Š” ๋‘ ๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ‚ค์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” mappingFunction ์ž…๋‹ˆ๋‹ค . ์ด ๋ฉ”์„œ๋“œ์—์„œ ๋งคํ•‘ ํ•จ์ˆ˜๋Š” ๋งคํ•‘์ด ํ‘œ์‹œ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋งŒ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

computeIfAbsent() ๋ฉ”์„œ๋“œ ์ž‘๋™ ๋ฐฉ์‹

์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋“ฏ์ด Map.computeIfAbsent() ๋ฉ”์„œ๋“œ์—๋Š” ํ‚ค์™€ ์ด ํ‚ค mappingFunction ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜๋ผ๋Š” ๋‘ ๊ฐœ์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค . ๋ฐฉ๋ฒ•์˜ ๋…ผ๋ฆฌ์  ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  1. ๋ฉ”์„œ๋“œ๋Š” ๋จผ์ € ์ „๋‹ฌ๋œ ํ‚ค๊ฐ€ Map ์— ํ‘œ์‹œ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค .
  2. ํ‚ค๊ฐ€ Map ์— ํ‘œ์‹œ๋˜๊ณ  null์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๋ฉ”์„œ๋“œ๋Š” ์•„๋ฌด ์ž‘์—…๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  3. ํ‚ค๊ฐ€ Map ์— ํ‘œ์‹œ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ (๋˜๋Š” null์ธ ๊ฒฝ์šฐ) ๋ฉ”์„œ๋“œ๋Š” ํ‚ค์— ๋Œ€ํ•œ mappingFunction์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
  4. ๊ฒฐ๊ณผ ๊ฐ’์ด null์ด ์•„๋‹Œ ๊ฒฝ์šฐ ํ‚ค-๊ฐ’ ์Œ์„ ๋งคํ•‘์— ์”๋‹ˆ๋‹ค.
์ฝ”๋“œ์™€ ๋™์ผํ•œ ๋…ผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

computeIfAbsent() ์ฝ”๋“œ ์˜ˆ์ œ

๋”ฐ๋ผ์„œ ๊ฐ’์ด Map ์— ์—†์œผ๋ฉด ๋ฉ”์„œ๋“œ๊ฐ€ ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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"));
       }
}
์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ ๋‚ด ์—ด์‡ ๊ฐ€ ์žˆ๊ณ  ์ด๊ฒƒ์€ ์ƒˆ๋กœ์šด ๊ฐ€์น˜์ž…๋‹ˆ๋‹ค
์ด์ œ Map ์— ์ฃผ์–ด์ง„ ๊ฐ’์ด ์žˆ์„ ๋•Œ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ๋ด…์‹œ๋‹ค . ์Šคํฌ์ผ๋Ÿฌ ๊ฒฝ๊ณ : ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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"));
       }
}
๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ ๋‚ด ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค
๋ณด์‹œ๋‹ค์‹œํ”ผ ๊ฐ’์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•˜๋‚˜ ๋” ComputeIfAbsent() ์˜ˆ์ œ

์บ์‹ฑ ๊ฐœ๋…์— ์ต์ˆ™ํ•˜๋‹ค๋ฉด computeIfAbsent() ๋ฉ”์„œ๋“œ๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋– ์˜ฌ๋ฆฌ๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ข€ ๋” ๋ณต์žกํ•œ ๊ตฌ๋ฌธ ๋ถ„์„ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. computeIfAbsent() ๋ฉ”์„œ๋“œ๋ฅผ ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•˜์—ฌ ์ฒซ โ€‹โ€‹๋ฒˆ์งธ ๊ฒฝ์šฐ์—๋Š” ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๊ณ  ๋‘ ๋ฒˆ์งธ ๊ฒฝ์šฐ์—๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋„๋ก ํ•ฉ์‹œ๋‹ค.

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

}
๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
ํŒŒ์‹ฑ: 10 ํŒŒ์‹ฑ: 25 10+25=35 ํŒŒ์‹ฑ: 20 20+25=45 10+20=30
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION