java8Stream流处理中map和flatMap的区别
案例:对给定单词列表 ["Hello","World"],你想返回列表["H","e","l","o","W","r","d"]使用map方式@Testpublic void jdk8StreamMap() {List<String> words = new ArrayList<String>();words.add("hello");words.add("word");/
·
案例:对给定单词列表 ["Hello","World"],你想返回列表["H","e","l","o","W","r","d"]
使用map方式
@Test
public void jdk8StreamMap() {
List<String> words = new ArrayList<String>();
words.add("hello");
words.add("word");
//
words.stream()
//<R> Stream<R> map(Function<? super T, ? extends R> mapper)
.map(word -> {
//这里将接收到的字符串hello转换成['h','e','l','l','o']并返回,对word字符串也是如此
String[] retArray = word.split("");
//map返回的是String[]类型的
return retArray;
})
//经过map之后,得到的是Stream<String[]>
.forEach(e -> {
System.out.println(e);
});
}
代码输出为:[Ljava.lang.String;@12edcd21[Ljava.lang.String;@34c45dca
这个实现方式是由问题的,传递给map方法的lambda为每个单词生成了一个String[](String列表)。因此,map返回的流实际上是Stream<String[]> 类型的。
但是我们真正想要的是用Stream<String>来表示一个字符串。
使用flatMap方式(flat,flattern单词的意思就是折叠,压扁,扁平化)
在python中也有类似的函数flatten(),功能是将二维数组降维为一个以为数组,功能都类似
这里flatMap方法的功能注释:
flatMap()方法的作用是对一个stream流的元素进行一对多的转换,然后将结果折叠到一个新的stream中。
一定要记住的是,flatMap会将多个stream合并到一个新流里,这个是重要特点
@Test
public void jdk8StreamFlatMap() {
List<String> words = new ArrayList<String>();
words.add("hello");
words.add("word");
words.stream()
//The {@code flatMap()} operation has the effect of applying a one-to-many transformation to the elements of the stream, and then flattening the resulting elements into a new stream.
//<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
.flatMap(word -> {
//这里将接收的字符串hello转换成['h','e','l','l','o']数组,然后又转换成一个stream对象(对word也是如此),然后将这些stream合并成一个stream
//System.out.println("log->" + word);
return Arrays.stream(word.split(""));
})
//经过flatMap之后,得到的是Stream<String>
.distinct()
.collect(Collectors.toList())
.forEach(e -> {
System.out.println(e);
});
}
更多推荐
已为社区贡献1条内容
所有评论(0)