Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Realizar operação com o produto cartesiano de 2 streams

prezados,

tenho 2 streams e preciso realizar operações com todas as combinações possíveis dos 2 streams. Eu pensei, pensei, mas não consegui achar como. Eu criei uma BiFunction para realizar as operaçoes.

private final BiFunction<Tipo1, Tipo2, Retorno> minhasoperacoes = new BiFunction<Tipo1, Tipo2, Retorno>(){
@Override
        public Retorno apply(Tipo1 t1, Tipo2 t2) {
// operacoes e criacao do tipo de retorno...
Retorno r = new Retorno(t1, t2);
return r;
}

mas acabei ficando com os 2 fors, pq eu nao soube como fazer todas as combinacoes entre os 2 streams:

 for (Tipo1 t1 : listaDeT1) {
            for (Tipo2 t2 : listaDeT2) {
        Retorno r = minhasoperacoes.apply(t1, t2);
//mais operacoes sobre r
    }
}

a solucao pode usar lambda no lugar da bifunction, eu so tentei ver de todos os angulos.

abraços e muito obrigado! Lucas

2 respostas
solução!

Fala Antonio, tudo bem ?

Então da pra você usar map e flatMap pra desconstruir os elementos das duas streams em uma resultante.

Dê uma olhada nesse exemplo:

public class Teste {

    public static void main(String[] args) {

        List<String> ab = Arrays.asList("a", "b");
        List<String> cd = Arrays.asList("c", "d");

        Stream<Wrapper> stream = ab.stream().flatMap(e1 -> cd.stream().map(e2 -> new Wrapper(e1, e2)));
        List<Wrapper> wrappers = stream.collect(Collectors.toList());

        System.out.println(wrappers);
    }
}

class Wrapper {

    String str1;
    String str2;

    Wrapper(String st1, String st2) {
        this.str1 = st1;
        this.str2 = st2;
    }

    @Override
    public String toString() {
        return "Wrapper (" + str1 + ", " + str2 + ")";
    }    
}

Talvez possa te ajudar. Você pode mapear cada elemento da Stream para o wrapper que envolve os elementos das streams, e usar o flatMap pra evitar ficar com uma stream de streams de wrapper (Stream<Stream<Wrapper>>) na mão.

Output:

[Wrapper (a, c), Wrapper (a, d), Wrapper (b, c), Wrapper (b, d)]

Espero ter ajudado. Abraço!

oi Rafael,

desculpe a demora em responder, mas retiraram o suporte ao java 8 do projeto que eu trabalho, então nunca tive a chance de testar. Mas rodei localmente e entendi a lógica.

Seria interessante ter algum exemplo com o flatMap no curso para indicar seu uso.

Muito obrigado pela resposta clara!

Abraços, Lucas