您是否知道一些简洁的Java库,允许您制作两个(或更多)集的笛卡尔积?
例如:我有三套.一个是Person类的对象,第二个是类Gift的对象,第三个是GiftExtension类的对象.
我想生成一个包含所有可能的三元组Person-Gift-GiftExtension的集合.
集的数量可能会有所不同,所以我不能在嵌套的foreach循环中执行此操作.在某些情况下,我的应用程序需要制作一个Person-Gift对的产品,有时它是三人Person-Gift-GiftExtension,有时甚至可能会设置Person-Gift-GiftExtension-GiftSecondExtension-GiftThirdExtension等.
现在我只能实现两个集合的笛卡尔积,这里是代码:
public static <T1, T2, R extends Collection<Pair<T1, T2>>>
R getCartesianProduct(
Collection<T1> c1, Collection<T2> c2,
Collector<Pair<T1, T2>, ?, R> collector) {
return c1.stream()
.flatMap(e1 -> c2.stream().map(e2 -> new Pair<>(e1, e2)))
.collect(collector);
}
Run Code Online (Sandbox Code Playgroud)
这段代码在IntelliJ中工作正常,但在Eclipse中没有(编译器合规级别为1.8):
The method collect(Collector<? super Object,A,R>)
in the type Stream<Object> is not applicable for
the arguments (Collector<Pair<T1,T2>,capture#5-of ?,R>)
Run Code Online (Sandbox Code Playgroud)
这是Pair.java:
public class Pair<T1, T2> implements Serializable {
protected T1 first;
protected T2 second;
private static final long serialVersionUID = 1360822168806852921L;
public Pair(T1 first, T2 second) …Run Code Online (Sandbox Code Playgroud) 如何使用Java 8实现一个函数来获取一些流,并生成一个流,其中每个元素都是一个由流的笛卡尔积的一个成员组成的列表?
我已经看过这个问题 - 这个问题使用了一个聚合器BinaryOperator(采用类似类型的两个项目并生成相同类型的项目).我希望最终结果中的项目是Lists而不是输入流中的元素类型.
具体地说,假设我调用product了我想要的函数,如下:
Stream<List<String>> result =
product(
Stream.of("A", "B", "C", "D"),
Stream.of("I", "J", "K),
Stream.of("Y", "Z")
);
result.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
应该打印:
[A, I, Y]
[A, I, Z]
[A, J, Y]
[A, J, Z]
[A, K, Y]
[A, K, Z]
[B, I, Y]
...
[D, K, Y]
[D, K, Z]
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望这个操作尽可能地懒惰.例如,如果输入流是由生成的Stream.generate(),那么如果这些流的供应商在绝对需要之前没有被执行,那就太好了.