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

Using streams instead of nested for loops

我目前正在学习 java 8 个流。我有一个整数列表,值从 1 到 1000。现在,我想创建一个新的整数列表,其中每个元素都是 numbers 列表的每个元素相乘的结果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循环?

List<Integer> products = numbers.stream()
        .flatMap(i -> numbers.stream().map(j -> i * j))
        .collect(Collectors.toList());

i -> numbers.stream().map(j -> i * j)Function 以获得特定 iStream 产品。用它为numbersflatMap that s***中的每个元素生成一个Stream<Integer>,并将结果收集到一个List.

我不会说 looks/performs 比你想出的普通版本更好。

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

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