使用Java流API进行多级分组和求和

使用Java流API进行多级分组和求和,java,java-stream,collectors,multi-level,Java,Java Stream,Collectors,Multi Level,我有一节课 公共类人物{ 私有字符串名称; 私人国家; 私人城市; 私人宠物; 私人int totalCountryToCityCount; 私人整数; 公众人物(字符串名称、字符串国家、字符串城市、字符串宠物、整数总计、整数宠物计数){ this.name=名称; 这个国家=国家; this.city=城市; this.pet=pet; this.totalCountryToCityCount=总计; this.petCount=petCount; } 公共字符串getName(){ 返回名称

我有一节课

公共类人物{
私有字符串名称;
私人国家;
私人城市;
私人宠物;
私人int totalCountryToCityCount;
私人整数;
公众人物(字符串名称、字符串国家、字符串城市、字符串宠物、整数总计、整数宠物计数){
this.name=名称;
这个国家=国家;
this.city=城市;
this.pet=pet;
this.totalCountryToCityCount=总计;
this.petCount=petCount;
}
公共字符串getName(){
返回名称;
}
公共字符串getCountry(){
返回国;
}
公共字符串getCity(){
回归城市;
}
公共字符串getPet(){
归还宠物;
}
public int getPetCount(){
返回petCount;
}
public int getTotalCountryCountry()的值{
返回totalCountryToCityCount;
}
}
给出了Person类的列表,我已经根据类的不同属性进行了聚合。 例如-

Person-person1=新人(“约翰”、“美国”、“纽约”、“马克斯”,1,2);
Person person2=新人(“史蒂夫”、“英国”、“伦敦”、“露西”,2,8);
Person person3=新人(“安娜”、“美国”、“纽约”、“马克斯”,4,32);
personperson4=新人(“迈克”、“美国”、“芝加哥”、“杜克”,5,1);
Person person5=新人(“测试”、“印度”、“HYD”、“汤米”,4,32);
Person person6=新人(“测试1”,“印度”,“液压系统”,“汤米”,4,65);
personperson7=新人(“蒂姆”、“美国”、“芝加哥”、“杜克”,5111);
personperson8=新人(“蒂姆”、“美国”、“芝加哥”、“呕吐”,5111);
personperson9=新人(“测试1”,“印度”,“德里”,“汤米”,4,65);
列出人员=数组
.如清单所示(人员1、人员2、人员3、人员4、人员5、人员6、人员7、人员8、,
个人9);
现在我需要得到这样一个结果,我应该得到基于国家和城市组合的总“totalCountryToCityCount”,我应该得到基于国家、城市和宠物组合的总“petCount”。我可以使用groupingBy和SummingIT分别获取它们

国家/地区私人地图GetTotalCounts(列出人员){
return persons.stream().collect(groupingBy(Person::getCountry,getCityCount());
}
公共收集器getCityCount(){
返回分组依据(Person::getCity,summingit(Person::getTotal));
}
公共地图三级分组(列出人员){
返回人员
.stream().collect(
groupingBy(Person::getCountry、GroupByCity和DPetName()
)
);
}
专用收集器GroupByCity和DPetName(){
返回groupingBy(Person::getCity,groupByPetName());
}
专用收集器groupByPetName(){
返回分组依据(Person::getPet,summingit(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流API实现同样的功能

我也试过使用代码-

personList.stream().collect(分组依据:person->person.getCountry(),collecting然后(减少(
(a,b)->新人(a.getName(),a.getCountry(),a.getCity(),a.getPet(),
a、 getTotal()+b.getTotal(),a.getPetCount()+b.getPetCount()),
可选::get())
.forEach((国家,个人)->System.out.println(国家+个人));
但结果是-

USAPerson{name='John',country='USA',city='NYC'}
英国人{name='Steve',country='UK',city='London'}
印度{name='Test',country='INDIA',city='HYD'}

由于计数被意外删除

您真正需要的是
收集器::teeing
,但仅在java-12中可用:

System.out.println(
        persons.stream()
               .collect(Collectors.groupingBy(
                   Person::getCountry,
                   Collectors.groupingBy(
                       Person::getCity,
                       Collectors.teeing(
                           Collectors.summingInt(Person::getTotalCountryToCityCount),
                           Collectors.groupingBy(
                               Person::getPet,
                               Collectors.summingInt(Person::getPetCount)
                           ),
                           SimpleEntry::new
                       )
                   ))));

java-8的后端口可用。

但是
15
&
{Puke=111,Duke=112}
不是同一类型。您等待的结果类型是什么?我需要基于国家、城市和宠物数量的宠物总数的合计(总和),以及基于国家和城市的另一个合计(totalCountryToCityCount)。通过使用我在这里的代码部分添加的两个不同的收集器,我能够获得。但是它能在一次迭代中完成吗我明白了,但是
15
int
,而
{Puke=111,Duke=112}
Map
。。。因此,您的结果类似于
Map
。。可以吗?是的,只要我可以得到所需的结果,顺便说一句,Person不编译,并且不使用新的整数(…)@YassinHajaj
{USA={Chicago=15={Puke=111,Duke=112},NYC=5={Max=34},UK={London=2={Lucy=8},INDIA={drish=4={Tommy=65},HYD=8={Tommy=97}
与OP的要求有些不同,但我们希望他能接受:)
{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}
@YassinHajaj这是一种不同的格式,因为
SimplerEntry::new
,它可以通过
(左、右)->左+“,”右
来完成。