마지막으로 소개할 해법은 자바 8 함수형 스타일 방식이다.
public static Pair<Character, Long>
maxOccurenceCharacter(String str) {
return str.chars()
.filter(c -> Character.isWhitespace(c) == false) // 여백은 제외
.mapToObj(c -> (char) c)
.collect(groupingBy(c -> c, counting()))
.entrySet()
.stream()
.max(comparingByValue())
.map(p -> Pair.of(p.getKey(), p.getValue()))
.orElse(Pair.of(Character.MIN_VALUE, -1L));
}
먼저 빈도수를 값으로 해서 별개의 문자들을 Map의 키로 모은다. 이어서 자바 8의 Map.Entry.comparingByValue()와 max() 종결 연산을 사용해 값이 가장 큰(빈도수가 가장 높은) 맵 내 항목을 찾아낸다. max()가 종결 연산이므로 마지막에 Optional<Entry<Character, Long>>을 반환할 수도 있으나 위 해법에서는 단계를 하나 더 넣어 이 항목을 Pair<Character, Long>으로 매핑한다.