【问题标题】:Using streams instead of nested for loops使用流而不是嵌套的 for 循环
【发布时间】:2019-09-25 05:06:42
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:
    List<Integer> products = numbers.stream()
            .flatMap(i -> numbers.stream().map(j -> i * j))
            .collect(Collectors.toList());
    

    i -&gt; numbers.stream().map(j -&gt; i * j) 是一个Function,用于获取特定i 的产品Stream。使用它为numbers、flatMap that s***中的每个元素生成Stream&lt;Integer&gt;,并将结果收集到List中。

    我不会说它看起来/性能比你想出的普通版本更好。

    【讨论】:

      【解决方案2】:

      在速度和可读性方面,我强烈推荐前面提到的 Avi 解决方案

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-12
        • 1970-01-01
        • 2021-12-11
        • 1970-01-01
        • 1970-01-01
        • 2021-10-08
        • 2017-09-06
        • 1970-01-01
        相关资源
        最近更新 更多