Bob*_*Bob 4 java java-8 java-stream
我想加入两个流.我遇到了我的流关闭的问题,我不明白为什么.难道没有人请向我解释为什么会发生以下情况.
下面的代码不起作用.我在flatMap函数上得到一个例外,该流已经关闭了.
private Stream<KeyValuePair<T, U>> joinStreams(Stream<T> first, Stream<U> second) {
return
first
.map(x -> second
.map(y -> new KeyValuePair<T, U>(x, y))
)
.flatMap(x -> x);
}
Run Code Online (Sandbox Code Playgroud)
当我第一次从第二个流中收集一个列表,然后从该列表中获取一个流时,它确实有效.请参阅下面的示例.
private Stream<KeyValuePair<T, U>> joinStreams(Stream<T> first, Stream<U> second) {
List<U> secondList = second.collect(Collectors.toList());
return
first
.map(x -> secondList.stream()
.map(y -> new KeyValuePair<T, U>(x, y))
)
.flatMap(x -> x);
}
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚为什么会这样.有人可以解释一下吗?
编辑:
调用此函数的代码示例.
List<Integer> numbers1 = Arrays.asList(1, 2);
List<Integer> numbers2 = Arrays.asList(3, 4);
List<KeyValuePair<Integer, Integer>> combined = joinStreams(numbers1.stream(), numbers2.stream())
.collect(Collectors.toList());
// Expected result
// 1 3
// 1 4
// 2 3
// 2 4
Run Code Online (Sandbox Code Playgroud)
问题是你的代码试图处理第二Stream
次(第一次的每个元素一次Stream
).A Stream
只能处理一次,就像Iterator
只能迭代一次底层类的元素一样.
如果你的第一个Stream
只有一个元素,代码就可以工作,因为第二个元素Stream
只会被处理一次.
在有效的代码中,为第一个元素的每个元素生成一个new Stream
(from secondList
)Stream
,因此每个Stream
元素都处理一次,无论第一个元素有多少元素Stream
.