多个列表的笛卡尔积
您可以使用带有三个参数的reduce
方法:
identity
- 指定结果存根。
List<List<T>>
accumulator
- 将列表元素附加到结果。
List<List<T>> result,List<T> list
combiner
- 用于并行模式下,合并结果。
List<List<T>> result1, List<List<T>> result2
在线试用!
public static <T> List<List<T>> cartesianProduct(List<List<T>> lists) {
if (lists == null) return Collections.emptyList();
return lists.stream()
.filter(list -> list != null && list.size() > 0)
.reduce(
Collections.singletonList(Collections.emptyList()),
(result, list) -> result.stream()
.flatMap(inner -> list.stream()
.map(el -> {
List<T> nList = new ArrayList<>(inner);
nList.add(el);
return nList;
}))
.collect(Collectors.toList()),
(result1, result2) -> {
result1.addAll(result2);
return result1;
});
}
public static void main(String[] args) {
List<String> l1 = Arrays.asList("A", "B");
List<String> l2 = Arrays.asList("C", "D");
List<String> l3 = Arrays.asList("E", "F");
List<List<String>> cp = cartesianProduct(Arrays.asList(l1, l2, l3));
System.out.println(cp);
}
输出:
[[A,C,E],[A,C,F],[A,D,E],[A,D,F],[B,C,E],[B,C,F],[B,D,E],[B,D,F]]
另请参阅:三个集合的笛卡尔积