我目前正在学习Java 8流。我有一个整数列表,其值从1到1000。现在,我想创建一个新的整数列表,其中每个元素都是 numbers 列表中每个元素彼此相乘的结果数字列表的元素。
以下代码可以完成这项工作:
List<Integer> numbers = IntStream
.range(1,999)
.mapToObj(Integer::valueOf)
.collect(Collectors.toList());
List<Integer> products = new ArrayList<>();
for (Integer i : numbers) {
for (Integer j : numbers) {
products.add(i*j);
}
}
我想知道是否可以通过使用流来避免嵌套的for循环?
答案 0 :(得分:9)
List<Integer> products = numbers.stream()
.flatMap(i -> numbers.stream().map(j -> i * j))
.collect(Collectors.toList());
i -> numbers.stream().map(j -> i * j)
是Function
,用于获取特定Stream
的{{1}}产品。用它为i
,flatMap
that s***中的每个元素生成一个Stream<Integer>
,并将结果收集到numbers
中。
我不会说它的外观/性能要比您提出的普通版本更好。
答案 1 :(得分:0)
在速度和可读性方面,我强烈建议使用Avi先前提到的解决方案
List<Integer> products = new ArrayList<>();
numbers.forEach( i -> numbers.forEach( j -> products.add( i * j ) ) );