더북(TheBook)

마지막으로 소개할 해법은 자바 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>으로 매핑한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.