[英]Concat multiple fields into one string, then group by it using collection to find sum of each group
假設我有以下字段:
> String name1
> String name2
> String name3
> BigDecimal amount
我想使用一個String
對它們進行分組,該字符串是 name1、name2 和 name3 的串聯。
例如:
name1 = hi
name2 = am
name3 = sarah
String newString = hiamsarah
然后,在我設法通過鏈接的String
對對象進行分組之后,我想獲得每個組的amount
字段的總和。
這可能嗎?
我已經嘗試了任何可能的方法,但我就是無法通過它。 另外,我是 collections 的新手。
假設您的實例包含在一個List
中,並且在您的 class 中有一種返回鏈接名稱的方法,您可以使用集合 stream 並使用終端操作collect(Collectors.toMap())
按您的實例分組。
鏈接的值可以用作鍵, BigDecimal
值作為鍵對應的值,最后可以通過對BigDecimal
值求和來處理沖突情況。
由於您沒有提供您所指的 class 的代碼,我聲明了一個名為MyClass
的 class 包含 3 個String
字段和BigDecimal
。 這是代碼片段:
public class Main {
public static void main(String[] args) {
List<MyClass> list = new ArrayList<>(List.of(
new MyClass("I", "am", "Sarah", BigDecimal.valueOf(5.33)),
new MyClass("I", "am", "Frank", BigDecimal.valueOf(2.75)),
new MyClass("I", "am", "Sarah", BigDecimal.valueOf(3.56)),
new MyClass("I", "am", "Frank", BigDecimal.valueOf(7.12)),
new MyClass("I", "am", "John", BigDecimal.valueOf(1.11))
));
Map<String, BigDecimal> mapRes = list.stream()
.collect(Collectors.toMap(mc -> mc.chainNames(), mc -> mc.getAmount(), (decimal1, decimal2) -> decimal1.add(decimal2)));
System.out.println(mapRes);
}
}
測試 class 實現( MyClass
):
class MyClass {
private String name1;
private String name2;
private String name3;
private BigDecimal amount;
public MyClass(String name1, String name2, String name3, BigDecimal amount) {
this.name1 = name1;
this.name2 = name2;
this.name3 = name3;
this.amount = amount;
}
/* ... your implementation ...*/
public BigDecimal getAmount() {
return amount;
}
public String chainNames() {
StringBuilder strBld = new StringBuilder(name1);
strBld.append(name2);
strBld.append(name3);
return strBld.toString();
}
}
這里還有一個測試代碼的鏈接:
String::join
,第一個參數是一個分隔符,可以是一個空字符串String.join("", name1, name2, name3)
Collectors.groupingBy
+ Collectors.reducing
一起使用假設給定的 class 被實現為自 Java 14 以來提供的記錄,則提供以下實現:
public static void main(String[] args) {
record MyObj(String name1, String name2, String name3, BigDecimal amount) {
public String fullName() {
return String.join("", name1, name2, name3);
}
};
List<MyObj> list = List.of(
new MyObj("I", "am", "Sarah", BigDecimal.valueOf(5.33)),
new MyObj("I", "am", "Frank", BigDecimal.valueOf(2.75)),
new MyObj("I", "am", "Sarah", BigDecimal.valueOf(3.56)),
new MyObj("I", "am", "Frank", BigDecimal.valueOf(7.12)),
new MyObj("I", "am", "John", BigDecimal.valueOf(1.11))
);
Map<String, BigDecimal> mapRes = list.stream()
.collect(Collectors.groupingBy(
MyObj::fullName,
Collectors.reducing(BigDecimal.ZERO, MyObj::amount, BigDecimal::add)
));
System.out.println(mapRes);
}
Output:
{IamJohn=1.11, IamSarah=8.89, IamFrank=9.87}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.