连加十多天班到11,12点感觉自己要挂掉了。
今天总结一下java8中的一下lambda 函数编程。
1.分组
项目中很常遇到要把数据库搜索出来的东西按id,按订单号来分组。因为同一个父订单下是有很多子订单的。所以一个订单列表的数据结构是需要同一个父订单的对象要放在同一个list里面。
—旧方法
以前的话我一般会这样做, 1. 遍历数据库搜索出来的list-- 2. 第二步先创建一个map—此时这个map里面是空的。 3. 然后是先判断key,如果这个key不存在,那么我们就new一个list来把数据库搜索出来的当前对象set进new出来的list里面。再把这个list put进map。4 这时候我们的map里面就有了这个id的key了,当下一次判断id和这个key相同的时候就获取已存在的list,然后再把数据库查出来的set进去。
具体代码实现如下:
for (int i = 0; i < ordersResult.getResult().size(); i++) {
//这里是是判断map是否存在这个key
if (idMap.containsKey(ordersResult.getResult().get(i).getId() + "orders")) {
//用map的get set方法获取到这个key中的value==即new出来的那个list
idMap.get(ordersResult.getResult().get(i).getId()+"sileMap");
List<OrderResponse> mapList = (List) idMap
.get(ordersResult.getResult().get(i).getId() + "orders");
OrderResponse or = new OrderResponse();
or.setId(ordersResult.getResult().get(i).getId());
or.setMoneyOrder(ordersResult.getResult().get(i).getMoneyOrder());
or.setEvaluateState(ordersResult.getResult().get(i).getEvaluateState());
or.setOrderState(ordersResult.getResult().get(i).getOrderState());
or.setProductCount(ordersResult.getResult().get(i).getProductCount());
or.setProductImg(ordersResult.getResult().get(i).getProductImg());
or.setProductMoney(ordersResult.getResult().get(i).getProductMoney());
or.setProductTitle(ordersResult.getResult().get(i).getProductTitle());
or.setSellerName(ordersResult.getResult().get(i).getSellerName());
mapList.add(or);
idMap.put(ordersResult.getResult().get(i).getId() + "orders", mapList);
} else {
List<OrderResponse> list = new ArrayList<>();
OrderResponse or = new OrderResponse();
or.setId(ordersResult.getResult().get(i).getId());
or.setMoneyOrder(ordersResult.getResult().get(i).getMoneyOrder());
or.setEvaluateState(ordersResult.getResult().get(i).getEvaluateState());
or.setOrderState(ordersResult.getResult().get(i).getOrderState());
or.setProductCount(ordersResult.getResult().get(i).getProductCount());
or.setProductImg(ordersResult.getResult().get(i).getProductImg());
or.setProductMoney(ordersResult.getResult().get(i).getProductMoney());
or.setProductTitle(ordersResult.getResult().get(i).getProductTitle());
or.setSellerName(ordersResult.getResult().get(i).getSellerName());
list.add(or);
idMap.put(ordersResult.getResult().get(i).getId() + "orders", list);
}
}
反正我写完后我是觉得非常的麻烦,所以想给总结一下用的新方法
新方法:
先看代码–
List<MyOrderDetailResponse> listAndroid = new ArrayList<>();
List<Orders> result = ordersResult.getResult();
括号内:
Map<Integer, List<Orders>> collect = result.stream()
.collect(Collectors.groupingBy(Orders::getId));
collect.forEach((k, v) -> {
Orders orders = v.get(0);
Date createTime = orders.getCreateTime();
String formatDate = DateUtil.format(createTime, "yyyy-MM-dd HH:mm:ss");
MyOrderDetailResponse myOrderDetailResponse = new MyOrderDetailResponse();
//这一步是swagger--为了让返回数据模型所以copy了自定义的response
List<OrderResponse> copyList = BeanCopyUtils.copyList(v, OrderResponse.class);
myOrderDetailResponse.setList(copyList);
myOrderDetailResponse.setOrderCreateTime(formatDate);
listAndroid.add(myOrderDetailResponse);
});
一看简便多了。
(Orders::getId)) 前面的表示根据哪个泛型来分类–后者表示根据哪个字段分