zoukankan      html  css  js  c++  java
  • 高效 告别996,开启java高效编程之门 3-23汇总操作实战案例

    1    重点:

    1.1  collect demo

    1.2  merge方法(见demo中并行计算逻辑)

    1.3  并行计算方法

    1.4  lombok的优缺点

    http://blog.itpub.net/69908877/viewspace-2676272/

    2    merge方法(结合demo)

    merge是说如果从map1中发现key,那么就把value作为参数,map1中的value也作为参数 传递进来。然后你去定义这两个key重合的value如何处理。

    如果key没在map1中出现,做的操作就是把value push到map1中。

    3    汇总操作实战案例

    测试类:

     /**
         *     汇总collect Demo
         *      需求:从一批订单中分别找到用户下的数量和总额,按照用户计算平均商品价格
         */
        @Test
        public void collectTest(){
    
            /**
             * 订单对象
             * @Data 注入SetGet方法                 后边lombok会讲
             * @AllArgsConstructor  注入传参方法
             */
            class Order{
                private Integer id;             //订单编号
                private Integer orderCount;     //订单数量
                private Double orderTotalPrice; //订单总价
                private String userID;          //用户编号
    
                public Order(Integer id, Integer orderCount, Double orderTotalPrice, String userID) {
                    this.id = id;
                    this.orderCount = orderCount;
                    this.orderTotalPrice = orderTotalPrice;
                    this.userID = userID;
                }
    
                public Integer getId() {
                    return id;
                }
    
                public void setId(Integer id) {
                    this.id = id;
                }
    
                public Integer getOrderCount() {
                    return orderCount;
                }
    
                public void setOrderCount(Integer orderCount) {
                    this.orderCount = orderCount;
                }
    
                public Double getOrderTotalPrice() {
                    return orderTotalPrice;
                }
    
                public void setOrderTotalPrice(Double orderTotalPrice) {
                    this.orderTotalPrice = orderTotalPrice;
                }
    
                public String getUserID() {
                    return userID;
                }
    
                public void setUserID(String userID) {
                    this.userID = userID;
                }
            }
    
            //准备数据
            ArrayList<Order> list = Lists.newArrayList();
            list.add(new Order(1,3,9.00,"zhangsan"));
            list.add(new Order(1,2,100.00,"zhangsan"));
            list.add(new Order(1,1,11.00,"lisi"));
    
            /**
             * 汇总操作
             * 三个参数,第一个此初始化,第二个计算逻辑,第三个并行计算逻辑
             */
            Map<String,Order> colletMap =list.stream()
                    //.parallel()
                    .collect(
                            //第一个参数,初始化一个容器
                            () -> {
                                System.out.println("初始化逻辑");
                                return new HashMap<String, Order>();
                            },
                            //第二个传参数,实现计算逻辑,如果map中有该订单,则在该map中分别进行订单金额,订单数量的累加
                            (HashMap<String, Order> map, Order newOrder) -> {
                                System.out.println("计算逻辑");
                                String sUserID = newOrder.getUserID();
                                if (map.containsKey(sUserID)) {
                                    Order order1 = map.get(sUserID);
                                    map.get(sUserID).setOrderTotalPrice(order1.getOrderTotalPrice() + newOrder.getOrderTotalPrice());
                                    map.get(sUserID).setOrderCount(order1.getOrderCount() + newOrder.getOrderCount());
                                } else {
                                    map.put(newOrder.getUserID(), newOrder);
                                }
                            },
    
                            //第三个参数,实现并行计算
                            (HashMap<String, Order> map1, HashMap<String, Order> map2) -> {
                                System.out.println("并行逻辑");
                                map2.forEach((key, value) -> {
                                    map1.merge(key, value, (order1, order2) -> {
                                        return new Order(0, order1.getOrderCount() + order2.getOrderCount(), order1.getOrderTotalPrice() + order2.getOrderTotalPrice(), key);
                                    });
                                });
                            });
            System.out.println(JSONObject.toJSONString(colletMap,true));
        }

    打印日志:

    初始化逻辑
    计算逻辑
    计算逻辑
    计算逻辑
    {
        "lisi":{
            "id":1,
            "orderCount":1,
            "orderTotalPrice":11.0,
            "userID":"lisi"
        },
        "zhangsan":{
            "id":1,
            "orderCount":5,
            "orderTotalPrice":109.0,
            "userID":"zhangsan"
        }
    }
    
    Process finished with exit code 0
  • 相关阅读:
    【CodeVS 3290】【NOIP 2013】华容道
    【UOJ #20】【NOIP 2014】解方程
    【UOJ #17】【NOIP 2014】飞扬的小鸟
    【UOJ #147】【NOIP 2015】斗地主
    【UOJ #150】【NOIP 2015】运输计划
    【POJ 3241】Object Clustering 曼哈顿距离最小生成树
    【COGS 254】【POI 2001】交通网络图
    【CodeVS 2083】Cryptcowgraphy 解密牛语
    1654 方程的解
    2124: 等差子序列
  • 原文地址:https://www.cnblogs.com/1446358788-qq/p/12861874.html
Copyright © 2011-2022 走看看