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