通过首先过滤同一对象的其他唯一值来求和对象的值

时间:2019-05-31 20:38:08

标签: java list arraylist java-8 java-stream

比方说,我有一个对象列表,可以将此对象称为具有数量和价格作为字段的对象订单。

例如如下:

对象Order(字段quantityprice)列表包含以下值:

Quantity  Price

5         200
6         100
3         200
1         300

现在,我想使用Java-8来获取以以下方式过滤的列表:

Quantity  Price

8         200
6         100
1         300

价格是要从中过滤并求和价格的任何数量的唯一值,我想以此为基础形成新列表。

谢谢,我建议如何使用Java 8 lambda表达式来做到这一点。

1 个答案:

答案 0 :(得分:9)

以下import json import pandas as pd from pandas.io.json import json_normalize result_data = [ { "title": "Czech Republic", "group_dimensions": { "content": { "key": "123456789", "title": "Some Book" }, "store_front_ica": { "key": "143489", "title": "Czech Republic" } }, "data": [ { "date": "2019-03-17T00:00:00.000Z", "units": 0.0 }, { "date": "2019-03-24T00:00:00.000Z", "units": 10.0 }, { "date": "2019-03-31T00:00:00.000Z", "units": 13.0 } ], "key": "143489", "metadata": { "key": "143489", "title": "Czech Republic" } }, { "title": "Romania", "group_dimensions": { "content": { "key": "123456789", "title": "Some Book" }, "store_front_ica": { "key": "143487", "title": "Romania" } }, "data": [ { "date": "2019-03-17T00:00:00.000Z", "units": 0.0 }, { "date": "2019-03-24T00:00:00.000Z", "units": 0.0 }, { "date": "2019-03-31T00:00:00.000Z", "units": 200.0 } ], "key": "143487", "metadata": { "key": "143487", "title": "Romania" } } ] 可以达到目的:

Stream

让我们分解一下:

  1. 以下代码返回一个List<Order> o = orders.stream().collect( Collectors.collectingAndThen( Collectors.groupingBy(Order::getPrice,Collectors.summingInt(Order::getQuantity)), map -> map.entrySet().stream() .map(e -> new Order(e.getKey(), e.getValue())) .collect(Collectors.toList()))); ,其中包含价格作为键(要作为总和的唯一值)及其总数量。密钥方法为Collectors.groupingBy,其中Map<Integer, Integer>描述密钥,而classifier定义一个值,该值将是数量的总和,因此Collectors.summingInt(取决于{{1 }}类型):

    downstream
  2. 所需的结构为quantity,因此您想对Map<Integer, Integer> map = orders.stream().collect( Collectors.groupingBy( // I want a Map<Integer, Integer> Order::getPrice, // price is the key Collectors.summingInt(Order::getQuantity)) // sum of quantities is the value List<Order>使用Collectors.collectingAndThen方法。 Collector<T, A, R> downstream是从第一点开始的分组,整理器将Function<R, RR> finisher转换回downstream

    Map<Integer, Integer>