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
诸葛