от
У меня есть класс
public class Person {

    private String name;
    private String country;
    private String city;
    private String pet;
    private int totalCountryToCityCount;
    private int petCount;

    public Person(String name, String country, String city, String pet, int total, int petCount) {
        this.name = name;
        this.country = country;
        this.city = city;
        this.pet = pet;
        this.total = total;
        this.petCount = petCount;
    }

    public String getName() {
        return name;
    }

    public String getCountry() {
        return country;
    }

    public String getCity() {
        return city;
    }

    public String getPet() {
        return pet;
    }

    public int getPetCount() {
        return petCount;
    }

    public int getTotal() {
        return total;

    }

}
и учитывая список класса Person, я сделал агрегации, основанные на различных свойствах класса. Например, -
Person person1 = new Person("John", "USA", "NYC", "Max", new Integer(1), 2);
        Person person2 = new Person("Steve", "UK", "London", "Lucy", 2, 8);
        Person person3 = new Person("Anna", "USA", "NYC", "Max", 4, 32);
        Person person4 = new Person("Mike", "USA", "Chicago", "Duke", 5, 1);
        Person person5 = new Person("Test", "INDIA", "HYD", "Tommy", 4, 32);
        Person person6 = new Person("Test1", "INDIA", "HYD", "Tommy", 4, 65);
        Person person7 = new Person("Tim", "USA", "Chicago", "Duke", 5, 111);
        Person person8 = new Person("Tim", "USA", "Chicago", "Puke", 5, 111);
        Person person9 = new Person("Test1", "INDIA", "DELHI", "Tommy", 4, 65);
List persons = Arrays
            .asList(person1, person2, person3, person4, person5, person6, person7, person8,
                person9);
Теперь мне нужно получить результат, такой, что я должен получить итоговое значение «totalCountryToCityCount» на основе комбинаций страны и города, а также общее количество «petCount» на основе комбинаций страны, города и домашнего животного. Я могу получить их отдельно, используя groupingBy и Summingint
private Map> getTotalCountForCountry(List persons) {
        return persons.stream().collect(groupingBy(Person::getCountry, getCityCount()));
    }

    public Collector> getCityCount() {
        return groupingBy(Person::getCity, summingInt(Person::getTotal));
    }

    public Map>> threeLevelGrouping(List persons) {
       return  persons
            .stream().collect(
                groupingBy(Person::getCountry, groupByCityAndPetName()
                )
            );
    }

    private Collector>> groupByCityAndPetName() {
        return groupingBy(Person::getCity, groupByPetName());
    }

    private Collector> groupByPetName() {
        return groupingBy(Person::getPet, summingInt(Person::getPetCount));
    }
который дает результат
{USA={Chicago={Puke=111, Duke=112}, NYC={Max=34}}, UK={London={Lucy=8}}, INDIA={DELHI={Tommy=65}, HYD={Tommy=97}}}
{USA={Chicago=15, NYC=5}, UK={London=2}, INDIA={DELHI=4, HYD=8}}
но фактический результат, который я хочу, это:
{USA={Chicago={15,{Puke=111, Duke=112}}, NYC={5,{Max=34} }, UK={London={2, {Lucy=8}}, INDIA={DELHI={4, {Tommy=65}}, , HYD={8,{Tommy=97}}}}
Есть ли способ добиться того же, используя Java Stream API              

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.
...