Java 8 Stream:从对象列表中提取地图并汇总特定键

Ibr*_*him 4 java java-8 java-stream

我有一个Customer对象列表

class Customer {
     //Other properties
     Map<String, Object> additionalData;
}
Run Code Online (Sandbox Code Playgroud)

当我得到了List<Customer> customers,我要总结一个名为关键transactionsadditionalData.我怎么能用java 8流做到这一点?

Era*_*ran 5

您可以将列表中的每个元素映射到相应映射中"transactions"键的值,然后将这些值相加:

int sum = customers.stream()
                   .map(c->(Integer)c.additionalData.get("transactions"))
                   .filter(Objects::nonNull)
                   .mapToInt (Integer::intValue)
                   .sum();
Run Code Online (Sandbox Code Playgroud)

例如:

Customer c1 = new Customer();
c1.additionalData = new LinkedHashMap<> ();
c1.additionalData.put ("transactions", 14);
Customer c2 = new Customer();
c2.additionalData = new LinkedHashMap<> ();
c2.additionalData.put ("transactions", 7);
Customer c3 = new Customer();
c3.additionalData = new LinkedHashMap<> ();
List<Customer> customers = Arrays.asList (c1,c2,c3);
int sum = customers.stream()
                   .map(c->(Integer)c.additionalData.get("transactions"))
                   .filter(Objects::nonNull)
                   .mapToInt (Integer::intValue)
                   .sum();
System.out.println ("sum is " + sum);
Run Code Online (Sandbox Code Playgroud)

输出:

sum is 21
Run Code Online (Sandbox Code Playgroud)

此代码假设additionalData成员永远不会null,并且"transactions"密钥的值(如果它存在Map)始终是Integer.如果这些假设不正确,则应相应地调整代码.

  • 你不需要最后的`.filter(Objects :: nonNull)`因为`null instanceof Integer`的计算结果是`false`. (2认同)