List<String> ordernos = orderList.stream().map(e -> e.getOrderno()).collect(Collectors.toList());什么意思
时间: 2024-04-22 18:25:24 浏览: 97
这行代码是使用 Java 8 的流式操作对一个订单列表进行处理。具体解释如下:
1. `orderList` 是一个订单列表,其中每个元素都是一个订单对象。
2. `stream()` 方法将订单列表转换为一个流,使得我们可以对其进行操作。
3. `map(e -> e.getOrderno())` 是对流中的每个订单对象应用一个映射操作。这里使用 lambda 表达式 `e -> e.getOrderno()` 来获取每个订单对象的订单编号。
4. `collect(Collectors.toList())` 将映射后的结果收集到一个新的列表中,返回类型是 `List<String>`。最终得到的 `ordernos` 列表包含了所有订单对象的订单编号。
简而言之,这行代码的作用是从订单列表中提取出所有订单对象的订单编号,并将其保存到一个新的字符串列表中。
相关问题
优化这段代码 //入库类型时返回结果 List<InOutProductVO> inList = null; //查询主表 inList = inOutStockMapper.queryInStockList(vo); //通过循环去查询详情并将对应的详细放入list( 根据条件查询详情) inList.stream().forEach(p->{ //这里加上单号查询 vo.setOtherNo(p.getOrderNo()); List<InOutProductDetailPO> list = inOutStockMapper.queryInStockListInfo(vo); p.setProductList(list); //因为查询需要总数这里需要累加总数 AtomicInteger total = new AtomicInteger(); list.stream().forEach(po->{ total.addAndGet(po.getProductNum()); }); p.setTotal(total.intValue()); //前端需要出入库类型这里手动添加 p.setInOutType(1); }); return new PageInfo<>(inList);
可以优化的地方有:
1. 使用Lambda表达式代替foreach循环
2. 避免重复查询,可以使用一个Map来缓存订单号对应的详情列表
3. 代码可读性可以更好,可以把一些常量抽象成字段或常量
下面是优化后的代码:
```
// 入库类型时返回结果
List<InOutProductVO> inList = new ArrayList<>();
// 查询主表
inList = inOutStockMapper.queryInStockList(vo);
// 用于缓存订单号对应的详情列表
Map<String, List<InOutProductDetailPO>> detailMap = new HashMap<>();
// 通过循环去查询详情并将对应的详细放入list( 根据条件查询详情)
inList.forEach(p -> {
// 这里加上单号查询
String orderNo = p.getOrderNo();
vo.setOtherNo(orderNo);
// 先从缓存里查找详情,如果没有再查询数据库
List<InOutProductDetailPO> list = detailMap.get(orderNo);
if (list == null) {
list = inOutStockMapper.queryInStockListInfo(vo);
detailMap.put(orderNo, list);
}
p.setProductList(list);
// 因为查询需要总数这里需要累加总数
AtomicInteger total = new AtomicInteger(0);
list.forEach(po -> {
total.addAndGet(po.getProductNum());
});
p.setTotal(total.intValue());
// 前端需要出入库类型这里手动添加
p.setInOutType(IN_STOCK_TYPE);
});
return new PageInfo<>(inList);
```
优化以下代码//入库类型时返回结果 List<InOutProductVO> inList = null; //查询主表(后续可进行优化) inList = inOutStockMapper.queryInStockList(vo); //通过循环去查询详情并将对应的详细放入list( 根据条件查询详情) inList.forEach(p->{ //这里加上单号查询 vo.setOtherNo(p.getOrderNo()); List<InOutProductDetailPO> list = inOutStockMapper.queryInStockListInfo(vo); p.setProductList(list); //因为查询需要总数这里需要累加总数 AtomicInteger total = new AtomicInteger(); list.forEach(po->{ total.addAndGet(po.getProductNum()); }); p.setTotal(total.intValue()); //前端需要出入库类型这里手动添加 p.setInOutType(1); }); return new PageInfo<>(inList);
优化建议如下:
1. 将查询主表与查询详情分离,避免每次查询都要重新查询主表。
2. 使用 Stream API 简化代码,避免显式使用循环。
3. 使用 lambda 表达式替换传统的匿名内部类,使代码更加简洁易懂。
4. 将累加总数的操作改为使用 Stream API 的 reduce 方法,避免使用 AtomicInteger。
重构后的代码如下:
```
List<InOutProductVO> inList = inOutStockMapper.queryInStockList(vo);
List<InOutProductDetailPO> detailList = inOutStockMapper.queryInStockListInfo(vo);
Map<String, List<InOutProductDetailPO>> detailMap = detailList.stream()
.collect(Collectors.groupingBy(InOutProductDetailPO::getOrderNo));
List<InOutProductVO> resultList = inList.stream().map(p -> {
List<InOutProductDetailPO> list = detailMap.get(p.getOrderNo());
p.setProductList(list);
p.setTotal(list.stream().mapToInt(InOutProductDetailPO::getProductNum).sum());
p.setInOutType(1);
return p;
}).collect(Collectors.toList());
return new PageInfo<>(resultList);
```
阅读全文