簡體   English   中英

將多個字段連接到一個字符串中,然后使用集合對其進行分組以查找每組的總和

[英]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();
    }
}

這里還有一個測試代碼的鏈接:

https://ideone.com/IL1ZQ8

  1. 要連接多個字符串,有方法String::join ,第一個參數是一個分隔符,可以是一個空字符串String.join("", name1, name2, name3)
  2. 要按列表中的某些值分組並匯總某個值,Stream API 應與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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM