使用 Java Lambda 创建两个(及更多)列表的笛卡尔积集合
Create collection of cartesian product of two (and more) lists with Java Lambda
我可以在 Scala 中使用类似以下内容轻松实现此目的:
def permute(xs: List[Int], ys: List[Int]) = {
for {x <- xs; y <- ys} yield (x,y)
}
所以如果我给它 {1, 2}, {3, 4} 我 return {1, 3}, {1, 4}, {2, 3}, {2, 4}
我希望能够使用流将其转换为 java8。
我遇到了一些困难,我希望能够将其扩展得更远,因为我希望能够从两个以上的列表中生成许多排列的测试样本。
即使使用流,它是否不可避免地会出现嵌套混乱,还是我不够努力?
在意识到我正在寻找笛卡尔积后发现了一些额外的答案:
我很难弄清楚你想要什么,看起来你想要得到笛卡尔积?比如,给定 {1, 2}
和 {3, 4}
,您期望 {(1, 3), (1, 4), (2, 3), (2, 4)}
? (就其价值而言,我认为这与排列的数学定义没有任何关系,排列通常涉及对单个列表的内容进行排序的不同方式。)
可以这么写
xs.stream()
.flatMap(x -> ys.stream().map(y -> Pair.of(x, y)))
.collect(toList());
如果你想避免重复,那么你是在组合而不是笛卡尔积之后。删除重复元素的一种方法是在第二个流之后使用过滤器,如下所示。
List<Integer> xs = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7));
List<Integer> ys = new ArrayList<>(Arrays.asList(3, 4, 5, 6, 7));
List<String> combinations =
xs.stream()
.flatMap(
x -> ys.stream()
.filter( y -> x != y)
.map(y -> x + ":" + y)
).collect(Collectors.toList());
System.out.println(combinations);
这将为您提供以下内容:
[1:3, 1:4, 1:5, 1:6, 1:7, 2:3, 2:4, 2:5, 2:6, 2:7, 3:4, 3:5, 3:6, 3:7, 4:3, 4:5, 4:6, 4:7, 5:3, 5:4, 5:6, 5:7, 6:3, 6:4, 6:5, 6:7, 7:3, 7:4, 7:5, 7:6]
我来自未来。我就是这样知道的。 =)
我可以在 Scala 中使用类似以下内容轻松实现此目的:
def permute(xs: List[Int], ys: List[Int]) = {
for {x <- xs; y <- ys} yield (x,y)
}
所以如果我给它 {1, 2}, {3, 4} 我 return {1, 3}, {1, 4}, {2, 3}, {2, 4}
我希望能够使用流将其转换为 java8。
我遇到了一些困难,我希望能够将其扩展得更远,因为我希望能够从两个以上的列表中生成许多排列的测试样本。
即使使用流,它是否不可避免地会出现嵌套混乱,还是我不够努力?
在意识到我正在寻找笛卡尔积后发现了一些额外的答案:
我很难弄清楚你想要什么,看起来你想要得到笛卡尔积?比如,给定 {1, 2}
和 {3, 4}
,您期望 {(1, 3), (1, 4), (2, 3), (2, 4)}
? (就其价值而言,我认为这与排列的数学定义没有任何关系,排列通常涉及对单个列表的内容进行排序的不同方式。)
可以这么写
xs.stream()
.flatMap(x -> ys.stream().map(y -> Pair.of(x, y)))
.collect(toList());
如果你想避免重复,那么你是在组合而不是笛卡尔积之后。删除重复元素的一种方法是在第二个流之后使用过滤器,如下所示。
List<Integer> xs = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7));
List<Integer> ys = new ArrayList<>(Arrays.asList(3, 4, 5, 6, 7));
List<String> combinations =
xs.stream()
.flatMap(
x -> ys.stream()
.filter( y -> x != y)
.map(y -> x + ":" + y)
).collect(Collectors.toList());
System.out.println(combinations);
这将为您提供以下内容:
[1:3, 1:4, 1:5, 1:6, 1:7, 2:3, 2:4, 2:5, 2:6, 2:7, 3:4, 3:5, 3:6, 3:7, 4:3, 4:5, 4:6, 4:7, 5:3, 5:4, 5:6, 5:7, 6:3, 6:4, 6:5, 6:7, 7:3, 7:4, 7:5, 7:6]
我来自未来。我就是这样知道的。 =)