map을 사용하면 함수가 각 요소에 적용되며, 리턴 값들이 새로운 스트림으로 모인다. 이번엔 다음처럼 단지 값 하나가 아닌, 값들의 스트림을 리턴하는 함수가 있다고 하자.
public static Stream<Character> characterStream(String s) {
List<Character> result = new ArrayList<>();
for (char c : s.toCharArray()) result.add(c);
return result.stream();
}
예를 들어, characterStream( "boat")는 스트림 ['b', 'o', 'a', 't']를 리턴한다. 이 메서드를 문자열의 스트림에 맵핑한다고 하자.
Stream<Stream<Character>> result = words.map(w -> characterStream(w));
결과로 [... ['y', 'o', 'u', 'r'], ['b', 'o', 'a', 't'], ...]처럼 스트림들로 구성된 스트림을 얻는다. 이 스트림을 문자들의 스트림 [... 'y', 'o', 'u', 'r', 'b', 'o', 'a', 't', ...]으로 펼쳐내려면 map 대신 flatMap을 사용한다.
Stream<Character> letters = words.flatMap(w -> characterStream(w))
// 각 단어를 대상으로 characterStream을 호출하고 결과들을 펼친다.