liste Regroupement d'objets et de réduire les sous-groupes dans les différents objets en Java 8

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 GroupedPersonsclasse qui prendra la dept, sumAmountet la personsOfDeptliste, 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 deptdes Personqui se traduira par un Map<String, List<Person>>, puis en utilisant le flux de la entrySet().stream()de la carte pour sommer les amountet 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());

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=236930&siteId=1
conseillé
Classement