我正在试图将两个流合并。 我遇到了一个问题,即我的流关闭了,我不明白为什么。 请问有谁能够解释一下为什么会出现以下情况。
下面的代码不起作用。 在flatMap函数上我收到一个异常,说这个流已经关闭了。
我不明白为什么会发生这种情况。请问有人可以解释一下吗?
编辑:
调用此函数的代码示例。
下面的代码不起作用。 在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);
}
当我首先从第二个流中收集列表,然后从该列表中抓取流时,它可以正常工作。请参见下面的示例。
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);
}
我不明白为什么会发生这种情况。请问有人可以解释一下吗?
编辑:
调用此函数的代码示例。
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
Supplier<Stream<U>>
参数而不是Stream<U>
,然后使用supplier.get()
方法。这样你就不会局限于从集合创建的流了,例如joinStreams(stream1, () -> IntStream.range(0,100).boxed())
这样的代码也能正常工作。对于集合源,你需要写成joinStreams(stream1, numbers2::stream)
的形式。 - Tagir Valeev