Ajuda com Filtro Arraylist

Olá amigos tenho uma dúvida e gostaria de uma ajuda para resolver da forma correta.

Elaborei um exemplo :

Abaixo tenho uma lista preenchida com 5 objetos Contrato e estes objetos a propriedade id_agrupamento.

Preciso dividir esta lista utilizando o id_de agrupamento como parametro de filtro.

A saida deveria ser :
Uma lista contendo os objetos c1 e c2
Uma lista contendo os objetos c3 e c4
Uma lista contendo o objeto c5

Como devo fazer para que a variavel saida abaixo receba estas 3 listas?

Object saida= contratos.stream().filter(???);

 package aaamain;



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

  public class Testes {

public static void main( String[] args ){

ArrayList<Contrato> contratos = new ArrayList<Contrato>();

Contrato c1 = new Contrato(1, 1);
Contrato c2 = new Contrato(2, 1);

Contrato c3 = new Contrato(3, 2);
Contrato c4 = new Contrato(4, 2);
Contrato c5 = new Contrato(5, 3);

contratos.add(c1);
contratos.add(c2);
contratos.add(c3);
contratos.add(c4);
contratos.add(c5);


Object saida= contratos.stream().filter(???);



           }




 }

 class Contrato {

int id_produto;
int id_contrato;

public Contrato( int id_produto , int id_contrato ){
super();
this.id_produto  = id_produto;
this.id_contrato = id_contrato;
}


public int getId_produto(){
return id_produto;
}


public void setId_produto( int id_produto ){
this.id_produto = id_produto;
}


public int getId_contrato(){
return id_contrato;
}


public void setId_contrato( int id_contrato ){
this.id_contrato = id_contrato;
}



 }

Até daria para vc fazer algo parecido com o que quer usando o método filter(), porém seria uma grande gambiarra.

O filter pega uma Stream é retorna uma nova Stream contendo apenas os elementos filtrados, não serve para agrupar dados.

Para agrupar temos opções especificas. Por exemplo:

Map<Integer, List<Contrato>> contratosSeparados = contratos
        .stream()
        .collect(Collectors.groupingBy(Contrato::getId_contrato));

for (Entry<Integer, List<Contrato>> entry : contratosSeparados.entrySet()) {
    System.out.println(entry);
}

Aqui o código completo modificado:

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

public class Testes {
    public static void main(String[] args) {
        ArrayList<Contrato> contratos = new ArrayList<Contrato>();

        Contrato c1 = new Contrato(1, 1);
        Contrato c2 = new Contrato(2, 1);

        Contrato c3 = new Contrato(3, 2);
        Contrato c4 = new Contrato(4, 2);
        Contrato c5 = new Contrato(5, 3);

        contratos.add(c1);
        contratos.add(c2);
        contratos.add(c3);
        contratos.add(c4);
        contratos.add(c5);

        Map<Integer, List<Contrato>> contratosSeparados = contratos
                .stream()
                .collect(Collectors.groupingBy(Contrato::getId_contrato));

        for (Entry<Integer, List<Contrato>> entry : contratosSeparados.entrySet()) {
            System.out.println(entry);
        }
    }
}

class Contrato {
    int id_produto;
    int id_contrato;

    public Contrato(int id_produto, int id_contrato) {
        this.id_produto = id_produto;
        this.id_contrato = id_contrato;
    }

    public int getId_produto() {
        return id_produto;
    }

    public void setId_produto(int id_produto) {
        this.id_produto = id_produto;
    }

    public int getId_contrato() {
        return id_contrato;
    }

    public void setId_contrato(int id_contrato) {
        this.id_contrato = id_contrato;
    }

    @Override
    public String toString() {
        return String.format("Contrato{contrato=%d, produto=%d}", id_contrato, id_produto);
    }
}

Eu adicionei um toString() em Contrato apenas para ficar mais fácil de visualizar com o println.

1 curtida

Obrigado. Resolvido

1 curtida