使用流而不是嵌套的for循环

时间:2019-09-23 13:59:20

标签: java java-8 java-stream nested-loops

我目前正在学习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循环?

2 个答案:

答案 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}}产品。用它为iflatMap that s***中的每个元素生成一个Stream<Integer>,并将结果收集到numbers中。

我不会说它的外观/性能要比您提出的普通版本更好。

答案 1 :(得分:0)

在速度和可读性方面,我强烈建议使用Avi先前提到的解决方案

List<Integer> products = new ArrayList<>();
numbers.forEach( i -> numbers.forEach( j -> products.add( i * j ) ) );