在Java 8中将对象列表分组并将子组简化为不同的对象

时间:2019-08-03 10:34:00

标签: java list object java-stream transform

我有将对象列表转换为不同类型的分组对象列表的要求。

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));

但是无法将地图缩小为我需要的对象列表。

1 个答案:

答案 0 :(得分:2)

我们可以为GroupedPersons类使用构造函数,该构造函数将使用deptsumAmountpersonsOfDept列表,如下所示:

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>