Collectors.toMap()
- 파라미터 2개 3개 4개 받을 수있다
- 셋다 기본적으로 (Function keyMapper, Function valueMapper) 를 받는다.
- 의미는 스트림 원소들 순회해서 key 랑 value 로 만들어서 map 으로 리턴한다는 뜻이다.
- 예를 들어 Person 이라는 객체가 있으면 아래 이미지 처럼 Map 으로 만들 수 있다.
- 파라미터 3개 들어가는건 (Function keyMapper, Function valueMapper, Function mapper) 인데 key가 중복으로 왔을때 어떻게 처리할건지 보여주는 것이다.
- key 가 중복이면 newValue 에다가 oldValue 를 더한 값을 Value 로 지정하겠다는 말이다.
- 파라미터가 4개 들어가는건, 마지막 네번째 파라미터는 Map 에서 특정 구현체를 선택하고 싶을때 넣을 수 있다. 기본은 HashMap 이다
map.merge()
- Map.merge() 메소드도 그런식으로 동작한다.
Map<String, Integer> map = new HashMap<>();
for (String[] strings : collect) {
for (String string : strings) {
if (map.get(string) == null) {
map.put(string, 1);
} else {
map.put(string, map.get(string) + 1);
}
}
}
- 위 코드는 merge 를 사용하지 않고 직접 클라이언트가 로직을 작성한 방식이다.
- String 배열을 돌려서 map 에 해당 String key 가 존재하지 여부를 판별하여 기본값을 1로 두고 key가 겹치면 +1을 더하는 방식이다.
- 위 코드가 정확히 아래코드와 일치하게 동작한다.
Map<String, Integer> map = new HashMap<>();
for (String[] strings : collect) {
for (String string : strings) {
map.merge(string, 1, Integer::sum);
}
}