java8 Stream流、Optional的用法总结
1.分组
Map> collectMap = list.stream().collect(Collectors.groupingBy(p -> p.getProductNo(), Collectors.toList()));
2.list转map
MapproDTOMap = list.stream().collect(Collectors.toMap(PurchaseDetailDTO::getProductNo, p->p,(p1,p2)->p1));
3.计算集合某元素之和
BigDecimal reduce = typeList.stream().map(m -> m.getCategoryDTO().getTaxAmount()).reduce(BigDecimal.ZERO, BigDecimal::add);
4.分组计算某元素之和
MapnumMap = list.stream().collect(Collectors.groupingBy(p -> p.getGroupId(), Collectors.reducing( BigDecimal.ZERO, QuoteStatics::getNum, ArithUtil::add2)));
5.list转嵌套map
Map> borrowMap = list.stream().collect(Collectors.groupingBy(CrmBorrowSummary::getUserId, Collectors.toMap(CrmBorrowSummary::getProductId, v -> v)));
6.list循环拼接字符串
String productStr = detailDTOList.stream().map(v -> v.getProductName() + "," + v.getNum() + v.getProductUnit() + "," +
v.getSupplyName() + "," + v.getPrice() + "元/" + v.getProductUnit() + "," +
"协议" + v.getSupplyPrice() + "元/" + v.getProductUnit())
.collect(Collectors.joining("n"));
Optional的用法
1.结合filter、ifPresent、orElseThrow等用法
Optional.ofNullable(deliverPlanDTO).filter(v -> StringUtils.isEmpty(v.getContractNo())).ifPresent(v ->
message.setStatus(CommonStatus.WAIT_APPROVE));
Optional.ofNullable(groupId).filter(StringUtils::isNotBlank).orElseThrow(
()-> new CommonException(ReturnCode.FAILED, "common.error", new String[]{"参数不正确!"}));
Optional.ofNullable(message.getToUsers()).filter(CollectionUtils::isNotEmpty).ifPresent(users -> {
users.stream().filter(v -> PersonType.TO.equals(v.getType()))
.filter(v -> CommonStatus.CLOSE.equals(v.getStatus()))
.forEach(v -> v.setStatus(CommonStatus.NORMAL));
});
2.取代if/else的判断
CrmQuoteFee fee=beanMapper.toCrmQuoteFee(reqdto);
Optional.ofNullable(reqdto.getId())
.map(u->fee.setModifyBy(reqdto.getCreateBy()))
.orElseGet(()->fee.setCreateBy(reqdto.getCreateBy()));
Optional.ofNullable(reqdto.getId())
.map(u->fee.setModifyBy(reqdto.getCreateBy()))
.orElseGet(()->{
fee.setCanDel(Boolean.TRUE);
fee.setType("1");
return fee;
}
);
3.链式调用,中间任意环节为null则返回
String managerStr = Optional.ofNullable(project).map(Project::getAgentId).map(crmCustomerDao::getCrmCustomerById).map(CrmCustomer::getCustomerManagerId).map(userService::getUserInfoByUserId)
.map(m -> "(" + m.getName() + "," + m.getMobile() + ")").orElse(null);



