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

Como aplicar recursos do Java neste metodo?

No problema abaixo preciso juntar os itens que tem o mesmo "documento", Do jeito que fiz funciona perfeitamente, mas gostaria de utilizar os recursos do Java8 como Stream, Map, Collectors...Como voces resolveriam?

    Detalhes: na List<ItemProdutoResumoFaturamento> vem desta forma
    {documento=10;numeroNF=11;emissooNF=10-10-2017;cliente=Ali SA;ReferePro=1;DeescriPro=Arroz}
    {documento=10;numeroNF=11;emissooNF=10-10-2017;cliente=Ali SA;ReferePro=2;DeescriPro=Feijão}
    {documento=10;numeroNF=11;emissooNF=10-10-2017;cliente=Ali SA;ReferePro=3;DeescriPro=Batata}
    {documento=15;numeroNF=12;emissooNF=20-11-2017;cliente=Souza SA;ReferePro=4;DeescriPro=Tempero}
    {documento=15;numeroNF=12;emissooNF=20-11-2017;cliente=Souza SA;ReferePro=1;DeescriPro=Arroz}
    {documento=22;numeroNF=13;emissooNF=10-12-2017;cliente=Silva SA;ReferePro=3;DeescriPro=Batata}

    Resultado esperado:
    InfoResumoNFEmitidas {
                documento=10,numeroNF=11,emissooNF=10-10-2017,cliente=Ali SA,Produtos{ReferePro=1,DeescriPro=Arroz;ReferePro=2,DescriPro=Feijão;ReferePro=3,DeescriPro=Batata};
                documento=15,numeroNF=12,emissooNF=20-11-2017,cliente=Souza SA,Produtos{ReferePro=4,DeescriPro=Tempero;ReferePro=1,DescriPro=Arroz};
                documento=22,numeroNF=13,emissooNF=10-12-2017,cliente=Silva SA,Produtos{ReferePro=3,DeescriPro=Batata}}

Metodo:

private List<InfoResumoNFEmitidas> getResumoProdutos(List<ItemProdutoResumoFaturamento> listOF) {
        Map<String, InfoResumoNFEmitidas> notas = new HashMap<>();

        for (ItemProdutoResumoFaturamento iprf : listOF) {
            InfoResumoNFEmitidas dadosNota = null;
            InfoResumoNFProdutos dadosProduto = null;
            if(notas.containsKey(iprf.getDocumento())){
                dadosNota = notas.get(iprf.getDocumento());
            }else{
                dadosNota = new InfoResumoNFEmitidas(
                        iprf.getNumeroNF(),
                        iprf.getEmissaoNF(), 
                        iprf.getCliente());
                notas.put(iprf.getDocumento(), dadosNota);
            }
            dadosProduto = new InfoResumoNFProdutos(
                    iprf.getReferePro(),
                    iprf.getDescriPro()); 
            dadosNota.getProdutoNF().add(dadosProduto);
        }
        return new ArrayList<InfoResumoNFEmitidas>(notas.values());
    }
2 respostas
solução!

Fala aí Rafael, blz?

Uma forma de resolver isso usando stream, lambdas e etc... Seria assim:

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Teste {

    public static void main(String[] args) {
        List<ItemProdutoResumoFaturamento> items = new ArrayList<>();


        items.add(new ItemProdutoResumoFaturamento(10, 11,"10-10-2017","Ali SA", 1, "Arroz"));
        items.add(new ItemProdutoResumoFaturamento(10, 11,"10-10-2017","Ali SA", 2, "Feijão"));
        items.add(new ItemProdutoResumoFaturamento(10, 11,"10-10-2017","Ali SA", 3, "Batata"));
        items.add(new ItemProdutoResumoFaturamento(15, 12,"20-10-2017","Souza SA", 4, "Tempero"));
        items.add(new ItemProdutoResumoFaturamento(15, 12,"20-10-2017","Souza SA", 1, "Arroz"));
        items.add(new ItemProdutoResumoFaturamento(15, 13,"10-10-2017","Silva SA", 3, "Batata"));


        List<InfoResumoNFEmitidas> notas =
        items.stream()
                .collect(Collectors.groupingBy(ItemProdutoResumoFaturamento::getDocumento))
                .values()
                .stream()
                    .collect(Collectors.toMap(  list -> list.stream().findFirst().map( i -> new InfoResumoNFEmitidas(i.getDocumento(), i.getNumeroNF(), i.getEmissaoNF(), i.getCliente())).get(),
                                                list -> list.stream().map(i -> new InfoResumoNFProdutos(i.getReferePro(), i.getDescriPro())).collect(Collectors.toList())))
                .entrySet()
                    .stream()
                        .peek(e -> e.getKey().getProdutoNF().addAll(e.getValue()))
                    .map(Map.Entry::getKey)
                    .collect(Collectors.toList());
    }

}

class InfoResumoNFEmitidas {
    private Integer documento;
    private Integer numeroNF;
    private String emissaoNF;
    private String cliente;
    private List<InfoResumoNFProdutos> produtoNF = new ArrayList<>();

    public InfoResumoNFEmitidas(Integer documento, Integer numeroNF, String emissaoNF, String cliente) {
        this.documento = documento;
        this.numeroNF = numeroNF;
        this.emissaoNF = emissaoNF;
        this.cliente = cliente;
    }

    public Integer getDocumento() {
        return documento;
    }

    public Integer getNumeroNF() {
        return numeroNF;
    }

    public String getEmissaoNF() {
        return emissaoNF;
    }

    public String getCliente() {
        return cliente;
    }

    public List<InfoResumoNFProdutos> getProdutoNF() {
        return produtoNF;
    }

    @Override
    public String toString() {
        return "InfoResumoNFEmitidas{" +
                "documento=" + documento +
                ", numeroNF=" + numeroNF +
                ", emissaoNF='" + emissaoNF + '\'' +
                ", cliente='" + cliente + '\'' +
                ", produtoNF=" + produtoNF +
                '}';
    }
}


class InfoResumoNFProdutos {
    private Integer referePro;
    private String descriPro;

    public InfoResumoNFProdutos(Integer referePro, String descriPro) {
        this.referePro = referePro;
        this.descriPro = descriPro;
    }

    public Integer getReferePro() {
        return referePro;
    }

    public String getDescriPro() {
        return descriPro;
    }

    @Override
    public String toString() {
        return "InfoResumoNFProdutos{" +
                "referePro=" + referePro +
                ", descriPro='" + descriPro + '\'' +
                '}';
    }
}


class ItemProdutoResumoFaturamento {
    private Integer documento;
    private Integer numeroNF;
    private String emissaoNF;
    private String cliente;
    private Integer referePro;
    private String descriPro;


    public ItemProdutoResumoFaturamento(Integer documento, Integer numeroNF, String emissaoNF, String cliente, Integer referePro, String descriPro) {
        this.documento = documento;
        this.numeroNF = numeroNF;
        this.emissaoNF = emissaoNF;
        this.cliente = cliente;
        this.referePro = referePro;
        this.descriPro = descriPro;
    }


    public Integer getDocumento() {
        return documento;
    }

    public Integer getNumeroNF() {
        return numeroNF;
    }

    public String getEmissaoNF() {
        return emissaoNF;
    }

    public String getCliente() {
        return cliente;
    }

    public Integer getReferePro() {
        return referePro;
    }

    public String getDescriPro() {
        return descriPro;
    }
}

Boa tarde Fernando. Valeu pela ajuda, funciono certinho, eu ate tava indo pelo caminho certo, mas me perdia ali na parte do meio no toMap

.stream()
     .collect(Collectors.toMap(  list -> list.stre....

Muito obrigado pela ajuda.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software