puv*_*uvi 4 java java-8 java-stream flatmap
我试图理解flatMap:flatMap(x->stream.of(x) )不平坦流和flatMap(x->x.stream())工作,并给出所需的结果.有人可以解释两者之间的区别吗?
import java.util.*;
import java.util.stream.*;
class TestFlatMap{
public static void main(String args[]){
List<String> l1 = Arrays.asList("a","b");
List<String> l2 = Arrays.asList("c","d");
Stream.of(l1, l2).flatMap((x)->Stream.of(x)).forEach((x)->System.out.println(x));
Stream.of(l1, l2).flatMap((x)->x.stream()).forEach((x)->System.out.println(x));
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
[a, b]
[c, d]
a
b
c
d
Run Code Online (Sandbox Code Playgroud)
Stream.of(x)生成单个元素的流 - x.因此,flatMap返回a Stream<List<String>>而不是Stream<String>.
另一方面,返回的x.stream()地方x是a,其源是元素,所以在你的情况下它返回一个,它允许产生一个包含源的所有s中的所有s .Collection<E>Stream<E>CollectionStream<String>flatMapStream<String>StringList<String>Stream
你可以在Javadoc中看到:
<T> Stream<T> java.util.stream.Stream.of(T t)
返回包含单个元素的顺序Stream .
与
Stream<E> stream()
返回以此集合为源的顺序Stream .
你想到的是这个:
Stream.of(l1, l2)
// String[]::new isn't really needed in this simple example,
// but would be in a more complex one...
.flatMap((x)->Stream.of(x.toArray(String[]::new)))
.forEach((x)->System.out.println(x));
Run Code Online (Sandbox Code Playgroud)
这也会产生a, b, c, d如你所料的扁平流.Stream.of()有两种风格:
Stream.of(T)采取单一价值,如伊兰所解释Stream.of(T...)拿一个数组(不是List你想象的)因为,当传递List给Stream.of(),唯一适用的重载是采用单个值的那个,你得到的Stream<List<String>>不是预期的Stream<String>
| 归档时间: |
|
| 查看次数: |
334 次 |
| 最近记录: |