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