为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

鸿蒙传说 2022-12-28 10:38:42
假设我有一个对象列表,我们可以将此对象称为订单,其中包含数量和价格作为字段。例如如下:对象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())));

让我们分解一下:

  1. 以下代码返回一个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
  2. 所需的结构是List<Order>,因此您希望使用Collectors.collectingAndThen带有Collector<T, A, R> downstreamand的方法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>


查看完整回答
反对 回复 2022-12-28
  • 1 回答
  • 0 关注
  • 108 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号