gpt4 book ai didi

java - Collectors.reducing 方法在用作 Collectors.partitionBy 的下游时更新相同的身份

转载 作者:行者123 更新时间:2023-12-04 08:21:35 33 4
gpt4 key购买 nike

我有一个类似于下面的类 MyObject .

public class MyObject {
private String key; // not unique. multiple objects can have the same key.
private boolean isPermanent;
private double value1;
private double value2;

public MyObject merge(MyObject m){
value1 += m.getValue1();
value2 += m.getValue2();
return this;
}

// getters, setters and constructors...
}
以下是样本数据:
List<MyObject> objs = new ArrayList<>();

objs.add(new MyObject("1", false, 100, 200));
objs.add(new MyObject("2", false, 300, 100));
objs.add(new MyObject("1", false, 200, 300));

objs.add(new MyObject("3", true, 100, 200));
objs.add(new MyObject("1", true, 500, 100));
objs.add(new MyObject("1", true, 100, 100));
我想根据 isPermanent 组合这些对象和 key并做了以下事情:
(请注意,我在下面的代码中添加了 import static java.util.stream.Collectors.* 以导入 groupingBypartitioningByreducing )
objs.stream()
.collect(partitioningBy(MyObject::isPermanent,
groupingBy(MyObject::getKey,
reducing(new MyObject(), MyObject::merge))));

返回的 map 类型为 Map<Boolean, Map<String, MyObject>> .
我期待 map 返回如下(忽略除 value1value2 以外的字段)
{false : { 1 : { 300, 500 } } , { 2 : { 300, 100 } }, true : { 1 : { 600, 200 } } , { 3 : { 100, 200 } } }
但我得到的结果是这样的:
{false : { 1 : { 1300, 1000 } } , { 2 : { 1300, 1000 } }, true : { 1 : { 1300, 1000 } } , { 3 : { 1300, 1000 } } }
由于我将一个对象作为身份传递,因此我相信每个组都会更新相同的对象。由于 lambda 不能传递到 reduction方法,有没有办法解决这个问题?

最佳答案

您可以使用 static返回新实例的合并函数:

public static MyObject merge(MyObject one,MyObject two) {
MyObject merged = new MyObject ();
merged.setValue1(one.getValue1()+two.getValue1());
merged.setValue2(one.getValue2()+two.getValue2());
return merged;
}
您必须删除现有的非静态 merge方法为了 static由编译器选择的方法代替方法引用。
这样, MyObject::merge将产生一个新的 MyObject每次都实例。
如果您不想删除现有方法,您仍然可以添加 static方法,如果您用以下 lambda 表达式替换方法引用:
(o1,o2)->MyObject.merge(o1,o2)
不添加 static方法,可以替换 MyObject::merge使用以下 lambda 表达式的方法引用:
(o1,o2)-> new MyObject().merge(o1).merge(o2)

关于java - Collectors.reducing 方法在用作 Collectors.partitionBy 的下游时更新相同的身份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65475331/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com