Использование потоков вместо вложенных циклов - PullRequest
3 голосов
/ 23 сентября 2019

В настоящее время я изучаю потоки 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 с помощьюпотоки?

Ответы [ 2 ]

9 голосов
/ 23 сентября 2019
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 продуктов для определенного i.Используйте его для генерации Stream<Integer> для каждого элемента в numbers, flatMap, что s ***, и соберите результат в List.

Я бы не сталСказать, что он выглядит / работает лучше, чем простая версия, которую вы придумали.

0 голосов
/ 25 сентября 2019

с точки зрения скорости и читаемости, я настоятельно рекомендую ранее упомянутое решение от Avi

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