computeIfAbsent​(K key, Function<? super K,​? extends V> mappingFunction)
putIfAbsent​(K key, V value)
computeIfPresent​(K key, BiFunction<? super K,​? super V,​? extends V> remappingFunction)
compute​(K key, BiFunction<? super K,​? super V,​? extends V> remappingFunction)

computeIfAbsent 와 putIfAbsent 

자바에서 맵에서 특정 키(Key)들에 항목(Value)을 넣어주고 싶은 경우가 있다. 

 

Key Value
1 KOREA
2 USA
4 JAPAN
? ?

추가되는 키가 없을 경우 함수를 호출해서 항목을 넣어줄 수 있다.

 

만약 키 값이 4 = CHINA , 5 = CANADA 를 리턴하는 함수 선언

private String getCountry(String key){
	System.out.println("@@@@@ : " + key);
	return key.equals("4") ? "CHINA" : "CANADA";
}

맵에는 1,2,3 에 대한 값만 있고, 키 리스트는 1,2,3,4,5 일 경우 

computeIfAbsent를 이용하여 4,5에 값을 넣을 수 있다.

List<String> keyList = new ArrayList<>();
keyList.add("1");
keyList.add("2");
keyList.add("3");
keyList.add("4");
keyList.add("5");

Map<String, String> map = new HashMap<>();
map.put("1", "KOREA");
map.put("2", "USA");
map.put("3", "JAPAN");

for(String s : keyList){
	map.computeIfAbsent( s, (key) -> getCountry(key) );
}

System.out.println("map = " + map);

결과는 putIfAbsent 도 동일한 결과를 보여준다

map = {1=KOREA, 2=USA, 3=JAPAN, 4=CHINA, 5=CANADA}

computeIfAbsent 와 putIfAbsent 차이

putIfAbsent는 키(Key)가 있음에도 함수를 호출함 (*단 항목을 변경하지 않음)

 

computeIfAbsent 의 결과 출력

@@@@@ : 4
@@@@@ : 5
map = {1=KOREA, 2=USA, 3=JAPAN, 4=CHINA, 5=CANADA}

putIfAbsent 의 결과 출력

@@@@@ : 1
@@@@@ : 2
@@@@@ : 3
@@@@@ : 4
@@@@@ : 5
map = {1=KOREA, 2=USA, 3=JAPAN, 4=CHINA, 5=CANADA}

computeIfPresent 와 compute

단어의 빈도 수를 체크하는 프로그램을 만들 때

어떤 단어가 몇 번 나왔는지 체크할때 유용하게 사용할 수있다.

 

text에 단어가 몇 번 나왔는지 맵에 저장, 일단 초기값은 0 이다.

String text = "KOREA KOREA USA USA USA CANADA JAPAN ";

Map<String, Integer> wordMap = new HashMap<>();

wordMap.put("KOREA", 0);
wordMap.put("USA", 0);
wordMap.put("CHINA", 0);
wordMap.put("JAPAN", 0);

 

computeIfPresent 을 이용하여 빈도 수를 계산한다.

for(String word : text.split(" ")){
	wordMap.computeIfPresent(word, (String key, Integer value) ->  ++value);
}

System.out.println("wordMap = " + wordMap);

 

결과는... 

wordMap = {USA=3, CHINA=0, JAPAN=1, KOREA=2}

computeIfPresent 와 compute 차이

위에 결과를 compute로 바꾸면 에러(NullPointerException)가 발생한다. 

CANADA가 없기 때문이다. CANADA가 없다면 결과는 동일하다. 

 

그리고 ... getOrDefault

값이 없을 때 널을 피하기 위하여 디폴트를 지정할 수 있다. 

Map<String, String> map = new HashMap<>();
map.put("1", "KOREA");
map.put("2", "USA");

System.out.println("map = " + map.getOrDefault("3", "FRANCE"));
System.out.println("map = " + map.get("3"));

결과는...

map = FRANCE
map = null

+ Recent posts