共计 2454 个字符,预计需要花费 7 分钟才能阅读完成。
1.Stream 是在 Java8 新增的个性,广泛称其为流;它不是数据结构也不寄存任何数据,其次要用于汇合的逻辑解决。
2.Stream 流是一个汇合元素的函数模型,它并不是汇合,也不是数据结构,其自身并不存储任何元素(或其地址值),它只是在原数据集上定义了一组操作。
3.Stream 流不保留数据,Stream 操作是尽可能惰性的,即每当拜访到流中的一个元素,才会在此元素上执行这一系列操作。
4.Stream 流不会扭转原有数据,想要拿到扭转后的数据,要用对象接管。
串行流 stream:串行解决数据,不产生异步线程。
并行流 parallelStream:parallelStream 提供了流的并行处理,它是 Stream 的另一重要个性,其底层应用 Fork/Join 框架实现。简略了解就是多线程异步工作的一种实现。
倡议:数据量不大的状况下倡议应用 stream 即可,不要自觉大量应用 parallelStream, 因为 parallelStream 是多线程异步的,也就是说会产生多线程,耗费内存不说,说不定还会更慢,并非肯定会更快更好。
上面说说罕用的几种办法:
1.groupingBy 办法:次要是转化数据为 Map,value 是符合条件的汇合
// 增加的洽购申请 id 汇合
List<PurchaseRequisition> requisitionList = new ArrayList<>();
Map<String, List<PurchaseRequisitionSkuParams>> skuMap = requisitionParams.getSkuList().stream().collect(Collectors.groupingBy(PurchaseRequisitionSkuParams::getBrandName));
skuMap.forEach((brandName,skus)->{
// 生成洽购申请编码
purchaseRequisition.setPurchaseRequisitionCode(purchaseCodeUtil.getNextPurchaseCode());
// 保留洽购信息
requisitionMapper.savePurchaseRequisition(purchaseRequisition);
requisitionList.add(purchaseRequisition);
// 保留洽购物料明细
requisitionMapper.saveSkuList(purchaseRequisition.getId(),skus);
});
2.toMap 办法:次要是转化数据为 Map,value 是该条记录或字段值
// sku 数量校验
Map<String, BigDecimal> skuNumMap = requisitionParams.getSkuList().stream().collect(Collectors.toMap(PurchaseRequisitionSkuParams::getSkuId,PurchaseRequisitionSkuParams::getNum,(v1,v2) -> v1.add(v2)));
// 查出购买的数量
List<CustomerOderSkuNumVO> numVOList =
customerOrderMapper.querySkuNum(requisitionParams.getCustomerOrderId(), skuNumMap.keySet());
numVOList.stream().forEach(numVO ->{if (skuNumMap.get(numVO.getSkuId()).compareTo(numVO.getNum()) > 0){throw new ValidateException(ApiResponseCode.ABNORMAL_DATA.getCode(), "洽购的物料数量不能大于客户订单数量!");
}
});
3.filter 办法:次要是用来筛选数据的
List<Admin> adminList = adminMapper.selectList(null);
adminList = adminList.stream().filter(admin -> admin.getAdminState() != null).collect(Collectors.toList());
4.anyMatch 办法:用于判断数据,只有有一个条件满足即返回 true
List<Admin> adminList = adminMapper.selectList(null);
boolean isAdmin = adminList.stream().anyMatch(admin -> admin.getAdminState() != null);
5.allMatch 办法:用于判断数据,必须全副都满足才会返回 true
List<Admin> adminList = adminMapper.selectList(null);
boolean isAdmin = adminList.stream().allMatch(admin -> admin.getAdminState() != null);
6.noneMatch 办法:用于判断数据,全都不满足才会返回 true
List<Admin> adminList = adminMapper.selectList(null);
boolean isAdmin = adminList.stream().noneMatch(admin -> admin.getAdminState() != null);
7.map 办法:个别用于获取属性值
List<Admin> adminList = adminMapper.selectList(null);
List<Long> adminIdList = adminList.stream().map(Admin::getId).collect(Collectors.toList());