使用 Java 8 流从 List<Obj> 查找嵌套值的总和

问题描述 投票:0回答:2

下面是我的 JSON 请求。我的要求是找到

"cols"."value"
字段的总数,如果
"cols"."name"="tran_amt"

{
  "request" : {
    "reqID" : "6839796504132",
    "processID" : 97904250,
    "tables" : [ {
      "tableName" : "TABLE_NAME",
      "records" : [ {
        "recordID" : "record_id1",
        "cols" : [ {
          "name" : "tran_amt",
          "type" : "VARCHAR2",
          "value" : "562356"
        }, {
          "name" : "tran_id",
          "type" : "VARCHAR2",
          "value" : "123456"
        } ]
      }, {
        "recordID" : "record_id2",
        "cols" : [ {
          "name" : "tran_amt",
          "type" : "VARCHAR2",
          "value" : "987098"
        }, {
          "name" : "tran_id",
          "type" : "VARCHAR2",
          "value" : "123456"
        } ]
      } ]
    } ]
  }
}

这是我尝试过的解决方案:

cols = request.getTables().get(0).getRecords().get(0).getCols();
total = cols.stream().filter(o -> "tran_amt".equalsIgnoreCase(o.getName())).mapToInt(o -> Integer.valueOf(o.getValue())).sum();

我的解决方案仅从“cols”的第一个对象中检索“值”(在本例中为 562356)。它不会对所有符合条件的“值”求和。

有什么我说错的地方吗?

java collections java-8 java-stream
2个回答
1
投票

试试这个:

total = request.getTables()
               .stream()
               .flatMap(t -> t.getRecords().stream())
               .flatMap(r -> r.getCols().stream())
               .filter(c -> "tran_amt".equalsIgnoreCase(c.getName()))
               .mapToInt(c -> Integer.valueOf(c.getValue()))
               .sum();

1
投票

如果您想对

value
索引处第一个表的所有
Col
Records
0
字段的所有值求和

total = getTables().get(0) .getRecords() .stream() .map(Col::getCols) .flatMap(List::stream) .filter(o -> "tran_amt".equalsIgnoreCase(o.getName())) .mapToInt(o -> Integer.valueOf(o.getValue())).sum();
    
© www.soinside.com 2019 - 2024. All rights reserved.