두 번째 해법은 자바 8의 스트림 기능을 활용한다. 이 해법은 세 단계로 이뤄진다. 처음 두 단계에서는 주어진 문자열을 Stream<Character>로 변환하고, 나머지 한 단계에서는 문자를 분류하고 센다. 단계는 다음과 같다.
1. 원래 문자열에 String.chars() 메서드를 호출한다. 이 메서드는 IntStream을 반환한다. IntStream은 주어진 문자열 내 문자를 정수로 표현한다.
2. mapToObj() 메서드로 IntStream을 문자 스트림으로 변환한다(이 메서드는 정수 표현을 사람이 읽기 쉬운 문자 형태로 변환한다).
3. 끝으로 문자를 분류하고(Collectors.groupingBy()) 센다(Collectors.counting()).
위 세 단계를 메서드 하나로 합치면 다음과 같다.
public Map<Character, Long> countDuplicateCharacters(String str) {
Map<Character, Long> result = str.chars()
.mapToObj(c -> (char) c)
.collect(Collectors.groupingBy(c -> c, Collectors.counting()));
return result;
}