我试图了解2.6
: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));
}
}
答案 0 :(得分:7)
Stream.of(x)
生成单个元素的流 - x
。因此,flatMap
会返回Stream<List<String>>
而不是Stream<String>
。
另一方面,x.stream()
其中x
是Collection<E>
会返回Stream<E>
,其来源是Collection
的元素,因此在您的情况下它返回Stream<String>
,这允许flatMap
生成Stream<String>
,其中包含来源String
的所有List<String>
中的所有Stream
个<T> Stream<T> java.util.stream.Stream.of(T t)
你可以在Javadoc中看到:
Stream<E> stream()
返回包含单个元素的顺序Stream 。。
VS
1 Jan 2001
返回以此集合为源的顺序Stream 。
答案 1 :(得分:5)
你想到的是这个:
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));
如您所料,这也会产生a, b, c, d
的扁平流。 Stream.of()
有两种形式:
Stream.of(T)
采用Eran Stream.of(T...)
正在使用数组(而非List
正如您所料)因为,在将List
传递给Stream.of()
时,唯一适用的重载是获取单个值的重载,您得到的是Stream<List<String>>
而不是预期的Stream<String>
< / p>