Java 8 的 Stream 的 flatMap 有点难用言语表示,我记录一个工作中的例子,读取一个文件中的 key 和 value 值。我把文件的每一行用一个数组表示,然后获取对应的key, value,放到数组中
String[] arrayOfWords = {"start line", "key=value", "end line"};
List<String> keyValue = Arrays.stream(arrayOfWords)
.filter(line -> line.contains("=")) // Stream<String>
.map(word -> word.split("=")) // Stream<String[]>
.map(Arrays::stream) // Stream<Stream<String>>
.flatMap(stream->stream) // Stream<String>
.collect(Collectors.toList());
从这个例子可以看出,flatMap 其实是把 Stream<Stream<String>>
转化为 Stream<String>
,也就是说 flatMap 的作用其实就是把流的集合(Stream<Stream<String>>
)转化为了单一的流(Stream<String>
)。
这个例子有点啰嗦,只是为了直观说明 flatMap 的作用,简洁的写法如下
List<String> keyValue = Arrays.stream(arrayOfWords)
.filter(line -> line.contains("="))
.flatMap(line -> Stream.of(line.split("=")))
.collect(Collectors.toList());