본문 바로가기

강의/TDD, Clean Code with Java 12기

스트림 실습

map, reduce, filter 실습 1

List에 담긴 모든 숫자 중 3보다 큰 숫자를 2배 한 후 모든 값의 합을 구한다.

지금까지 학습한 map, reduce, filter를 활용해 구현해야 한다.

 

  • nextstep.fp.StreamStudyTest 클래스의 sumOverThreeAndDouble() 테스트를 pass해야 한다.

구현 결과

public static long sumOverThreeAndDouble(List<Integer> numbers) {
    return numbers.stream()
            .filter(integer -> integer > 3)
            .map(integer -> integer * 2)
            .reduce(0, (x,y) -> x + y);
}

 

map, reduce, filter 실습 2

nextstep.fp.StreamStudy 클래스의 printLongestWordTop100() 메서드를 구현한다. 요구사항은 다음과 같다.

  • 단어의 길이가 12자를 초과하는 단어를 추출한다.
  • 12자가 넘는 단어 중 길이가 긴 순서로 100개의 단어를 추출한다.
  • 단어 중복을 허용하지 않는다. 즉, 서로 다른 단어 100개를 추출해야 한다.
  • 추출한 100개의 단어를 출력한다. 모든 단어는 소문자로 출력해야 한다.

힌트

  • 단어의 길이가 12자를 초과하는 단어를 추출한다.
  • 12자가 넘는 단어 중 길이가 긴 순서로 100개의 단어를 추출한다.
    • sorted() method 활용
  • 단어 중복을 허용하지 않는다. 즉, 서로 다른 단어 100개를 추출해야 한다.
    • distinct() method 활용
  • 추출한 100개의 단어를 출력한다. 모든 단어는 소문자로 출력해야 한다.
    • String.toLowerCase() method 활용

구현 결과

public static void printLongestWordTop100() throws IOException {
    String contents = new String(Files.readAllBytes(Paths
            .get("src/main/resources/fp/war-and-peace.txt")), StandardCharsets.UTF_8);
    List<String> words = Arrays.asList(contents.split("[\\P{L}]+"));

    // TODO 이 부분에 구현한다.
    words.stream()
            .filter(word -> word.length() > 12)
            .sorted(Comparator.comparing(String::length).reversed())
            .distinct()
            .map(String::toLowerCase)
            .forEach(System.out::println);
}