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

假设我有一个对象列表,我们可以将此对象称为订单,其中包含数量和价格作为字段。


例如如下:


对象Order(字段quantity和price)列表包含以下值:


Quantity  Price


5         200

6         100

3         200

1         300

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


Quantity  Price


8         200

6         100

1         300

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


请建议我如何使用 Java 8 lambda 表达式执行此操作,谢谢。


鸿蒙传说
浏览 109回答 1
1回答

白衣染霜花

以下Stream是诀窍:List<Order>&nbsp;o&nbsp;&nbsp;=&nbsp;orders.stream().collect( &nbsp;&nbsp;&nbsp;&nbsp;Collectors.collectingAndThen( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Collectors.groupingBy(Order::getPrice,Collectors.summingInt(Order::getQuantity)), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map&nbsp;->&nbsp;map.entrySet().stream() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.map(e&nbsp;->&nbsp;new&nbsp;Order(e.getKey(),&nbsp;e.getValue())) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.toList())));让我们分解一下:以下代码返回一个Map<Integer, Integer>包含价格作为键(求和所基于的唯一值)及其求和数量的 a。关键方法是Collectors.groupingBy描述classifier关键并downstream定义一个值,这将是数量的总和,因此Collectors.summingInt(取决于quantity类型):Map<Integer,&nbsp;Integer>&nbsp;map&nbsp;=&nbsp;orders.stream().collect( &nbsp;&nbsp;&nbsp;&nbsp;Collectors.groupingBy(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;I&nbsp;want&nbsp;a&nbsp;Map<Integer,&nbsp;Integer> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Order::getPrice,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;price&nbsp;is&nbsp;the&nbsp;key &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Collectors.summingInt(Order::getQuantity))&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;sum&nbsp;of&nbsp;quantities&nbsp;is&nbsp;the&nbsp;value所需的结构是List<Order>,因此您希望使用Collectors.collectingAndThen带有Collector<T, A, R> downstreamand的方法Function<R, RR> finisher。这downstream是从第一点开始的分组,结束符将转换Map<Integer, Integer>回List<Order>:List<Order>&nbsp;o&nbsp;&nbsp;=&nbsp;orders.stream().collect( Collectors.collectingAndThen( &nbsp;&nbsp;&nbsp;&nbsp;grouping,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;you&nbsp;know&nbsp;this&nbsp;one&nbsp;;) &nbsp;&nbsp;&nbsp;&nbsp;map&nbsp;->&nbsp;map.entrySet()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.stream()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;iterate&nbsp;entries &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.map(e&nbsp;->&nbsp;new&nbsp;Order(e.getKey(),&nbsp;e.getValue()))&nbsp;&nbsp;//&nbsp;new&nbsp;Order(qty,&nbsp;price) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.toList())));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;as&nbsp;a&nbsp;List<Order>
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java