假设我有一个对象列表,我们可以将此对象称为订单,其中包含数量和价格作为字段。例如如下:对象Order(字段quantity和price)列表包含以下值:Quantity Price5 2006 1003 2001 300现在我想使用 Java-8 来获取按以下方式过滤的列表:Quantity Price8 2006 1001 300价格是从中过滤的唯一值,并对价格所具有的任何数量求和,我想以此为基础形成一个新列表。请建议我如何使用 Java 8 lambda 表达式执行此操作,谢谢。
1 回答

白衣染霜花
TA贡献1796条经验 获得超10个赞
以下Stream
是诀窍:
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())));
让我们分解一下:
以下代码返回一个
Map<Integer, Integer>
包含价格作为键(求和所基于的唯一值)及其求和数量的 a。关键方法是Collectors.groupingBy
描述classifier
关键并downstream
定义一个值,这将是数量的总和,因此Collectors.summingInt
(取决于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
and的方法Function<R, RR> finisher
。这downstream
是从第一点开始的分组,结束符将转换Map<Integer, Integer>
回List<Order>
:List<Order> o = orders.stream().collect( Collectors.collectingAndThen( grouping, // you know this one ;) map -> map.entrySet() .stream() // iterate entries .map(e -> new Order(e.getKey(), e.getValue())) // new Order(qty, price) .collect(Collectors.toList()))); // as a List<Order>
添加回答
举报
0/150
提交
取消