핵심 정리

스트림 패러다임의 핵심은 계산을 일련의 변환으로 재구성하는 부분이다.

각 변환 단계는 순수 함수여야 한다.

순수 함수: 부작용 (side-effect)이 없는 함수. 오직 입력만 결과에 영향을 준다.

부작용 예)

// 빈도표 초기화에 스트림을 적절하지 못하게 혹은 적절하게 사용하는 예 (277-279쪽)
public class Freq {
    public static void main(String[] args) throws FileNotFoundException {
        Stream<String> words = Arrays.asList("book", "BooK", "the", "book").stream();

        // 코드 46-1 스트림 패러다임을 이해하지 못한 채 API만 사용했다 - 따라 하지 말 것! (277쪽)
        **// 스트림 외부의 값을 변경하고 있기 때문에 올바르지 않다.** 
//        Map<String, Long> freq = new HashMap<>();
//        words.forEach(word -> freq.merge(word.toLowerCase(), 1L, Long::sum));

        // 코드 46-2 스트림을 제대로 활용해 빈도표를 초기화한다. (278쪽)
        **// 순수한 함수를 사용하는 예제**
        Map<String, Long> freq = words.collect(groupingBy(String::toLowerCase, counting()));
        System.out.println(freq);

        // 코드 46-3 빈도표에서 가장 흔한 단어 10개를 뽑아내는 파이프라인 (279쪽)
        List<String> topTen = freq.keySet().stream()
                .sorted(comparing(freq::get).reversed())
                .limit(10)
                .collect(toList());

        System.out.println(topTen);
    }
}