【发布时间】:2015-12-14 09:32:58
【问题描述】:
我想创建一个方法来创建元素流,这些元素流是多个给定流的笛卡尔积(最后由二元运算符聚合为相同类型)。请注意,参数和结果都是流,不是集合。
例如,对于 {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:流已被操作或关闭
流在哪里消费?通过平面地图?可以轻松解决吗?
【问题讨论】:
-
@mkobit:它很相似,但我认为它不是重复的,因为在这里你不使用参数中的集合,而是使用流,这可能会导致不同的方法
标签: java set java-8 java-stream cartesian-product