스트림 패러다임의 핵심은 계산을 일련의 변환으로 재구성하는 부분이다.
각 변환 단계는 순수 함수여야 한다.
순수 함수: 부작용 (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);
}
}