【发布时间】:2016-07-27 21:48:20
【问题描述】:
我在 JavaScript 中有一个笛卡尔积函数:
function cartesianProduct(arr) {
return arr.reduce(function(a,b) {
return a.map(function(x) {
return b.map(function(y) {
return x.concat(y);
});
}).reduce(function(a,b) { return a.concat(b); }, []);
}, [[]]);
}
如果我有一个 3D 数组:
var data = [[['D']], [['E'],['L','M','N']]];
cartesianProduct(data) 的结果将是二维数组:
[['D','E'], ['D','L','M','N']]
我正在尝试使用 Streams 在 Java 中编写这个笛卡尔积函数。
到目前为止,我在 Java 中有以下内容:
public Collection<Collection<String>> cartesianProduct(Collection<Collection<Collection<String>>> arr) {
return arr.stream().reduce(new ArrayList<Collection<String>>(), (a, b) -> {
return a.stream().map(x -> {
return b.stream().map(y -> {
return Stream.concat(x.stream(), y.stream());
});
}).reduce(new ArrayList<String>(), (c, d) -> {
return Stream.concat(c, d);
});
});
}
我有一个类型检查错误指出:
ArrayList<String>与Stream<Stream<String>>不兼容
我对问题的猜测:
- 我需要在某处使用收集器(可能在
Stream.concat之后) - 身份的数据类型错误
【问题讨论】:
-
这和叉积有什么关系?
-
我不认为 Stream 是正确的模型。 Stream 获取单个列表/集合/池/任何元素的元素并对其进行处理。但是您试图从两个独立的实体中获取元素并以特定方式组合它们。您可以使用 lambda 表达式来表示所有 JavaScript 闭包,但我认为 Stream 不是正确的工具。
-
@michaelsnowden 尝试使用 Java 流实现交叉积函数。您是否有任何实际价值可以添加到讨论中,或者您仍然感到困惑?
-
@Bobulous 上周我对 Streams 了解得越多,我就越意识到这一点。我认为我将 Streams 视为函数式编程中的闭包。
标签: java java-stream