더북(TheBook)

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));

다 됐다! 이제 어떤 문자가 문자열에 몇 번 나오는지 세는 법을 알아보자.

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