chars()와 filter()를 사용해 자바 8 함수형 스타일로 다시 작성할 수 있다.
private static final Set<Character> allVowels
= new HashSet(Arrays.asList('a', 'e', 'i', 'o', 'u'));
public static Pair<Long, Long> countVowelsAndConsonants(String str) {
str = str.toLowerCase();
long vowels = str.chars()
.filter(c -> allVowels.contains((char) c))
.count();
long consonants = str.chars()
.filter(c -> !allVowels.contains((char) c))
.filter(ch -> (ch >= 'a' && ch<= 'z'))
.count();
return Pair.of(vowels, consonants);
}
주어진 문자열을 조건에 맞게 필터링한 후 종결 연산(terminal operation)인 count()에서 결과를 반환한다. partitioningBy()를 사용하면 코드가 다음과 같이 줄어든다.
Map<Boolean, Long> result = str.chars()
.mapToObj(c -> (char) c)
.filter(ch -> (ch >= 'a' && ch <= 'z'))
.collect(partitioningBy(c -> allVowels.contains(c), counting()));
return Pair.of(result.get(true), result.get(false));
다 됐다! 이제 어떤 문자가 문자열에 몇 번 나오는지 세는 법을 알아보자.