puhlerblet:
Atualmente estou aprendendo java 8 fluxos. Eu tenho uma lista de números inteiros, com valores de 1 a 1000. Agora, eu quero criar uma nova lista de números inteiros, onde cada elemento é o resultado da multiplicação de cada elemento do número lista com o outro elemento do número lista.
O código a seguir faz o trabalho:
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);
}
}
Eu gostaria de saber se há uma maneira de evitar o laço for aninhado usando streams?
Andrew Tobilko:
List<Integer> products = numbers.stream()
.flatMap(i -> numbers.stream().map(j -> i * j))
.collect(Collectors.toList());
i -> numbers.stream().map(j -> i * j)
é um Function
para obter um Stream
dos produtos de um determinado i
. Usá-lo para gerar uma Stream<Integer>
para cada elemento numbers
, flatMap
que s *** , e recolher o resultado em um List
.
Eu não diria que parece / desempenho melhor do que a versão simples que você venha com.