MMSR:
J'ai cette exigence de transformer une liste d'objets dans la liste des objets groupés de type différent.
public class Person {
private String name;
private String dept;
private int amount;
//constructors
//getters and setters
}
public class GroupedPersons {
private String dept;
private int sumAmount;
private List<Person> personsOfDept;
// how should be the constructor??
//getters and setters
}
List<Person> persons = Arrays.asList(
new Person("Mark", "Sales", 100),
new Person("Rob", "Marketing", 200),
new Person("Kyle", "Sales", 150),
new Person("Jack", "Accounts", 50),
new Person("Sam", "Sales", 150),
new Person("Jeff", "Marketing", 200));
Je dois le résultat que
List<GroupedPersons>
["Sales",400,List<Person>]
["Marketing",400,List<Person>]
["Accounts",50,List<Person>]
j'ai essayé
Map<String,List<Person>> deptMap = persons.stream().collect(Collectors.groupingBy(Person::getDept));
Mais incapable de réduire la carte à la liste des objets que j'ai besoin.
Merci plein Guy:
Nous pouvons utiliser un constructeur pour la GroupedPersons
classe qui prendra la dept
, sumAmount
et la personsOfDept
liste, comme suit:
class GroupedPersons {
private String dept;
private int sumAmount;
private List<Person> personsOfDept;
public GroupedPersons(String dept, int sumAmount, List<Person> personsOfDept) {
this.dept = dept;
this.sumAmount = sumAmount;
this.personsOfDept = personsOfDept;
}
}
Ensuite , nous pouvons utiliser la logique suivante pour obtenir le premier regroupement effectué par dept
des Person
qui se traduira par un Map<String, List<Person>>
, puis en utilisant le flux de la entrySet().stream()
de la carte pour sommer les amount
et obtenir le List<Person>
du Map.Entry<String, List<Person>>.getValue()
:
List<GroupedPersons> list = persons.stream()
.collect(Collectors.groupingBy(p -> p.getDept()))
.entrySet()
.stream()
.map(ent -> new GroupedPersons(
ent.getKey(),
ent.getValue().stream().mapToInt(p -> p.getAmount()).sum(),
ent.getValue()))
.collect(Collectors.toList());