Java Collectors.groupingBy功能和字段求和

Java Collectors.groupingBy功能和字段求和,java,java-8,java-stream,Java,Java 8,Java Stream,我有一个点对象的列表,我希望通过某个键(名称字段)对这些对象进行分组,并通过该类的计数字段进行求和。上面的代码执行此任务,但返回点对象的映射。但是,我需要返回的点对象列表-而不是地图 对于Java8流,最干净的方法是什么 例如: .collect(Collectors.groupingBy(Point::getName, Collectors.summingInt(Point::getCount))); 谢谢导入java.util.ArrayList; 导入java.util.List; 导入

我有一个
对象的列表,我希望通过某个键(
名称
字段)对这些对象进行分组,并通过该类的
计数
字段进行求和。上面的代码执行此任务,但返回
对象的映射。但是,我需要返回的
对象列表-而不是地图

对于Java8流,最干净的方法是什么

例如:

.collect(Collectors.groupingBy(Point::getName, Collectors.summingInt(Point::getCount)));
谢谢

导入java.util.ArrayList;
导入java.util.List;
导入java.util.function.BiConsumer;
导入java.util.function.Supplier;
公共类指针{
私有字符串名称;
私人整数计数;
公共指针(字符串名称、整数计数){
this.name=名称;
this.count=计数;
}
公共字符串getName(){
返回名称;
}
public int getCount(){
返回计数;
}
公共作废增量计数(整数金额){
计数+=金额;
}
公共布尔等于(对象obj){
布尔相等=假;
if(指针的obj实例){
指针其他=(指针)obj;
equal=name.equals(other.getName());
}
回报相等;
}
公共字符串toString(){
返回名称+计数;
}
公共静态void main(字符串[]args){
列表=列表(新指针(“杰克”,1),
新指针(“杰克”,1),
新指针(“杰克”,1));
供应商=()->新的ArrayList();
双消费者累加器=(l,p)->{
如果(l.包含(p)){
指针elem=l.get(l.indexOf(p));
元素递增计数(p.getCount());
}
否则{
l、 加(p);
}
};
双消费组合器=(l1,l2)->{
};
List lst=List.stream()
.收集(供应商、蓄电池、合路器);
系统输出打印项次(lst);
}
}
导入java.util.ArrayList;
导入java.util.List;
导入java.util.function.BiConsumer;
导入java.util.function.Supplier;
公共类指针{
私有字符串名称;
私人整数计数;
公共指针(字符串名称、整数计数){
this.name=名称;
this.count=计数;
}
公共字符串getName(){
返回名称;
}
public int getCount(){
返回计数;
}
公共作废增量计数(整数金额){
计数+=金额;
}
公共布尔等于(对象obj){
布尔相等=假;
if(指针的obj实例){
指针其他=(指针)obj;
equal=name.equals(other.getName());
}
回报相等;
}
公共字符串toString(){
返回名称+计数;
}
公共静态void main(字符串[]args){
列表=列表(新指针(“杰克”,1),
新指针(“杰克”,1),
新指针(“杰克”,1));
供应商=()->新的ArrayList();
双消费者累加器=(l,p)->{
如果(l.包含(p)){
指针elem=l.get(l.indexOf(p));
元素递增计数(p.getCount());
}
否则{
l、 加(p);
}
};
双消费组合器=(l1,l2)->{
};
List lst=List.stream()
.收集(供应商、蓄电池、合路器);
系统输出打印项次(lst);
}
}

您可以使用带有合并函数作为参数的
收集器.toMap()

如果将函数添加到求和
count
字段:

input = [pt("jack", 1), pt("jack", 1), pt("jack", 1)]

result = [pt("jack", 3)]
然后您可以在
toMap()
中使用它:


您可以使用带有合并函数作为参数的
Collectors.toMap()

如果将函数添加到求和
count
字段:

input = [pt("jack", 1), pt("jack", 1), pt("jack", 1)]

result = [pt("jack", 3)]
然后您可以在
toMap()
中使用它:


事实上,你很接近。您可以将
键(名称)
值(点和)
重新打包到新的
对象中,并作为列表返回。请注意,通过重新分配到
列表
,您将销毁原来的一个,当然它将被垃圾收集。这种方法不需要修改当前类

[Point [name=jack, count=10]]

事实上,你很接近。您可以将
键(名称)
值(点和)
重新打包到新的
对象中,并作为列表返回。请注意,通过重新分配到
列表
,您将销毁原来的一个,当然它将被垃圾收集。这种方法不需要修改当前类

[Point [name=jack, count=10]]

好的,java streams wise我认为您可以从映射中对
条目进行流式处理,并将它们映射到列表中。看起来很直截了当。好吧,java streams wise我认为您可以从映射中对
条目进行流式处理,并将它们映射到一个列表中。看起来很直截了当。这是我试图做的,但我找不到语法使它工作。谢谢我的朋友修改传入的
实例是个坏主意。尝试输入
List List=Collections.nCopies(10,新点(“jack”,1))@Holger我想不出来了。好像只有一个
参考,它给出了错误的结果。我应该修改
sum()
还是以其他方式进行修改。。。你能解释一下吗?
sum()
函数应该创建一个新的
实例,而不是修改传入的参数。这在使用并行流时也很重要。如果新创建的对象的数量成为一个问题,则应使用基于
收集
的方法。@Holger谢谢。这是我试图做的,但我找不到使其工作的语法。谢谢我的朋友修改
要点
list = list.stream()
                .collect(Collectors.groupingBy(Point::getName,
                        Collectors.summingInt(Point::getCount)))
                .entrySet().stream()
                .map(e -> new Point(e.getKey(), e.getValue()))
                .collect(Collectors.toList());