我想创建一个方法,用于生成由多个给定流的笛卡尔积元素组成的流(通过二元运算符汇总到相同类型)。请注意,参数和结果都是流,而不是集合。
例如,对于两个流{A,B}和{X,Y},我希望它生成值流{AX,AY,BX,BY}(简单串联用于聚合字符串)。 到目前为止,我已经编写了以下代码:
private static <T> Stream<T> cartesian(BinaryOperator<T> aggregator, Stream<T>... streams) {
Stream<T> result = null;
for (Stream<T> stream : streams) {
if (result == null) {
result = stream;
} else {
result = result.flatMap(m -> stream.map(n -> aggregator.apply(m, n)));
}
}
return result;
}
这是我想要的使用案例:
Stream<String> result = cartesian(
(a, b) -> a + b,
Stream.of("A", "B"),
Stream.of("X", "Y")
);
System.out.println(result.collect(Collectors.toList()));
期望的结果:AX,AY,BX,BY
。
另一个例子:
Stream<String> result = cartesian(
(a, b) -> a + b,
Stream.of("A", "B"),
Stream.of("K", "L"),
Stream.of("X", "Y")
);
期望结果:AKX、AKY、ALX、ALY、BKX、BKY、BLX、BLY
。
然而,当我运行代码时,出现以下错误:
IllegalStateException: 流已经被操作或关闭
流在哪里被消耗了?是通过flatMap吗?它可以容易地修复吗?