gpt4 book ai didi

Java Lambda - 尝试按 2 组求和

转载 作者:搜寻专家 更新时间:2023-11-01 02:35:33 26 4
gpt4 key购买 nike

我有一个对象列表,我需要按 2 个不同的属性对其进行分组,然后对属性的值求和,我的对象的结构是这样的:

private Long id1;
private Long id2;
private Double amountReserved;
private Double amountRequired;
//... more atributes and getters and setters

所以,我有一个列表,例如:

List<MyList> list = Arrays.asList(
list(1, A, 50, 200)
list(1, A, 50, 200)
list(1, B, 0, 100)
list(2, A, 10, 15)
list(2, A, 5, 15)
list(3, A, 0, 25));

我想要实现的是一个具有以下结构的新列表:

list(1, A, 100, 100) 
list(1, B, 0, 100)
list(2, A, 15, 0)
list(3, A, 0, 25)

说明我要达到的要求是什么:

  1. 按 id1 和 id2 对对象进行分组
  2. 对分组对象的amountReserved求和
  3. 从求和的 amountReserved 中减去 amountRequired

我目前拥有的:

这个让我得到了我想要的分组

Map<Long, Map<String, List<MyList>>> map = null;
map = lista.stream().collect(Collectors.groupingBy(PreSeparacaoDto::getCodigoPedido,
Collectors.groupingBy(PreSeparacaoDto::getCodigoProduto)));

这个按组 id1 求和,但我很难在其上添加第二个分组,因为出现语法错误:

lista.stream()
.collect(Collectors.groupingBy(PreSeparacaoDto::getCodigoPedido,
Collectors.summingDouble(PreSeparacaoDto::getProdutoQuantidadeSeparada)))
.forEach((codigoPedido, ProdutoQuantidadeSeparada) -> System.out.println( codigoPedido + ": " + ProdutoQuantidadeSeparada ));

我的问题是我没能把它们放在一起(根据要求 2),甚至还没有接近达到我的要求 3。

如解释的那样,我尝试使用缩减 here ,但老实说,我无法用单个分组复制它,reducing 返回一个错误,通知我的参数不符合 reducing 参数。我在 stackoverflow 和其他网站上寻找了一些其他选项,但没有成功。

有人可以帮助我解决我未能将减少与我的团队相结合的地方,或者这是我应该遵循的正确路径。

最佳答案

我认为一个简单的方法是使用 Collectors.grouping :您告诉它如何分组以及收集什么。

这是一个示例,仅计算 AmountReserved 的总和:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class GroupedSums {

static class MyList {
Long id1;
char id2;
Double amountReserved;
Double amountRequired;
public Long getId1() {
return id1;
}
public char getId2() {
return id2;
}
public Double getAmountReserved() {
return amountReserved;
}
public Double getAmountRequired() {
return amountRequired;
}
public MyList(Long id1, char id2, Double amountReserved, Double amountRequired) {
super();
this.id1 = id1;
this.id2 = id2;
this.amountReserved = amountReserved;
this.amountRequired = amountRequired;
}

Key key() {
return new Key(id1, id2);
}

}

private static MyList list(Long id1, char id2, Double amountReserved, Double amountRequired) {
return new MyList(id1, id2, amountReserved, amountRequired);
}

public GroupedSums() {
}

private static class Key {

Long id1;
char id2;
public Long getId1() {
return id1;
}
public char getId2() {
return id2;
}
public Key(Long id1, char id2) {
super();
this.id1 = id1;
this.id2 = id2;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id1 == null) ? 0 : id1.hashCode());
result = prime * result + id2;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Key other = (Key) obj;
if (id1 == null) {
if (other.id1 != null)
return false;
} else if (!id1.equals(other.id1))
return false;
if (id2 != other.id2)
return false;
return true;
}
@Override
public String toString() {
return "[id1=" + id1 + ", id2=" + id2 + "]";
}

}

public static void main(String[] args) {
List<MyList> list = Arrays.asList(
list(1L, 'A', 50d, 200d),
list(1L, 'A', 50d, 200d),
list(1L, 'B', 0d, 100d),
list(2L, 'A', 10d, 15d),
list(2L, 'A', 5d, 15d),
list(3L, 'A', 0d, 25d));

list.stream().collect(Collectors.groupingBy(MyList::key, Collectors.summingDouble(MyList::getAmountReserved)))
.forEach((k,v)->System.out.println("" + k + " :" + v));
}

}

喂!

关于Java Lambda - 尝试按 2 组求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54947026/

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