我有将对象列表转换为不同类型的分组对象列表的要求。
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));
我需要结果
List<GroupedPersons>
["Sales",400,List<Person>]
["Marketing",400,List<Person>]
["Accounts",50,List<Person>]
我尝试了
Map<String,List<Person>> deptMap = persons.stream().collect(Collectors.groupingBy(Person::getDept));
但是无法将地图缩小为我需要的对象列表。
答案 0 :(得分:2)
我们可以为GroupedPersons
类使用构造函数,该构造函数将使用dept
,sumAmount
和personsOfDept
列表,如下所示:
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;
}
}
然后,我们可以使用以下逻辑首先对dept
的{{1}}进行分组,这将导致Person
,然后使用来自{{1映射}}},将Map<String, List<Person>>
求和并从entrySet().stream()
中获得amount
:
List<Person>