gpt4 book ai didi

java - 其他流的笛卡尔积流,每个元素作为一个列表?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:35:34 25 4
gpt4 key购买 nike

我如何使用 Java 8 实现一个函数来获取一定数量的流,并生成一个流,其中每个元素都是由流的笛卡尔积的一个成员组成的列表?

我看过this question -- 该问题使用了一个聚合器,它是 BinaryOperator(获取两个相似类型的项目并生成一个相同类型的项目)。我希望最终结果中的项目是 List 而不是输入流中元素的类型。

具体来说,假设我想要的函数叫做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);

应该打印:

[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]

理想情况下,我希望此操作尽可能惰性。例如,如果输入流由 Stream.generate() 生成,如果这些流的提供者在绝对需要时才执行,那就太好了。

最佳答案

可能的解决方案如下:

private static <T> Stream<List<T>> product(Stream<T>... streams) {
if (streams.length == 0) {
return Stream.empty();
}
List<List<T>> cartesian = streams[streams.length - 1]
.map(x -> Collections.singletonList(x))
.collect(Collectors.toList());
for (int i = streams.length - 2; i >= 0; i--) {
final List<List<T>> previous = cartesian;
cartesian = streams[i].flatMap(x -> previous.stream().map(p -> {
final List<T> list = new ArrayList<T>(p.size() + 1);
list.add(x);
list.addAll(p);
return list;
})).collect(Collectors.toList());
}
return cartesian.stream();
}

public static void main(String... args) {
final 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);
}

产品调用返回 Stream<List<String>>结果打印为

[A, I, Y]
[A, I, Z]
[A, J, Y]
[A, J, Z]
[A, K, Y]
[A, K, Z]
[B, I, Y]
[B, I, Z]
[B, J, Y]
[B, J, Z]
[B, K, Y]
[B, K, Z]
[C, I, Y]
[C, I, Z]
[C, J, Y]
[C, J, Z]
[C, K, Y]
[C, K, Z]
[D, I, Y]
[D, I, Z]
[D, J, Y]
[D, J, Z]
[D, K, Y]
[D, K, Z]

关于java - 其他流的笛卡尔积流,每个元素作为一个列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41528446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com