09 Stream<ArrayList<T>>에 있는 모든 요소들을 ArrayList<T> 하나로 결합하라. reduce의 세 가지 형태를 이용해 이 작업을 수행하는 방법을 보여라.
10 Stream<Double>의 평균을 계산하는 데 사용할 수 있는 reduce 호출을 작성하라. 단순히 합계를 계산해 count()로 나눌 수 없는 이유는 무엇인가?
11 단일 ArrayList를 스트림의 크기로 생성했다면, 여러 ArrayList를 병합하는 대신 단일 리스트 안에 스트림 결과들을 동시에 모을 수 있어야 한다. 이는 떨어진 위치에서 병행 set 연산은 스레드에 안전하기 때문이다. 이 작업을 어떻게 할 수 있는가?
12 “2.13 병렬 스트림” 절에서 설명한 것처럼 AtomicInteger 배열을 업데이트하는 방법으로 병렬 Stream<String>에 있는 모든 짧은 단어의 개수를 세라. 각 카운터를 안전하게 증가시키기 위해 원자적 메서드인 getAndIncrement를 사용한다.
13 연습문제 12를 다시 풀되, 이번에는 짧은 문자열을 걸러내고 collect 메서드를 Collectors.groupingBy, Collectors.counting과 조합해 사용하라.