Map<String, ApprovedSaleData> dapartMap = approvedSaleDataList.stream() .collect(Collectors.toMap(ApprovedSaleData::getDepartment, item -> item)); 怎么避免getDepartment值为空报空指针
时间: 2024-02-21 10:00:37 浏览: 56
你可以在使用 `Collectors.toMap()` 方法之前,使用 `filter()` 方法过滤掉 `getDepartment()` 方法返回 `null` 值的元素。例如:
```
Map<String, ApprovedSaleData> dapartMap = approvedSaleDataList.stream()
.filter(item -> item.getDepartment() != null)
.collect(Collectors.toMap(ApprovedSaleData::getDepartment, item -> item));
```
这样就可以避免 `getDepartment()` 返回 `null` 值导致的空指针异常。
相关问题
for (Winning winning : winnings) { // 若存在物流信息 发货时间不能为空 if (winning.getPostTime() != null){ rightNow.setTime(winning.getPostTime()); //日期加1个月 rightNow.add(Calendar.MONTH,1); flg = rightNow.getTime().compareTo(new Date()); if (flg <= 0 ){ flag = true; } } if (!VtuzxUtil.isEmpty(winning.getOutState())){ // 自动收货 if(winning.getOutState().equals(String.valueOf(PrizeOutStateEnum.Sent_ENUM.value())) && flag){ // 修改发放状态为已收货 winningDao.updOutStateById(String.valueOf(winning.getId()),PrizeOutStateEnum.Receive_Goods.value()); winning.setOutState(PrizeOutStateEnum.Receive_Goods.value()); flag = false; } } dataList.add( new VtuzxMap("prizeName",winning.getPrizeName()) .append("receiptNo",winning.getReceiptNo()) .append("companyName",winning.getCompanyName()) .append("department",winning.getDepartment()) .append("prizeNum",winning.getPrizeNum()) .append("outStore",winning.getOutStore()) .append("giveOut",winning.getGiveOut()) .append("userName",winning.getUserName()) .append("activityName",winning.getActivityName()) .append("outState",winning.getOutState()) .append("mobile",winning.getMobile()) .append("activityId",winning.getAwardActivityId()) .append("prizeType",winning.getPrizeType()) .append("clearingState",winning.getClearingState()) .append("postCompany",winning.getPostCompany()) .append("storeName", winning.getStoreName()) .append("postNo",winning.getPostNo()) .append("postName",winning.getPostName()) .append("contactMobile",winning.getContactMobile()) .append("province",winning.getProvince()) .append("city",winning.getCity()) .append("area",winning.getArea()) .append("createdAt",VtuzxUtil.formatYmdHmsF(winning.getCreatedAt())) .append("addressDetail",winning.getAddressDetail()) ); }使用stream优化
可以使用 Java 8 中的 stream 来优化上述代码,具体实现如下:
```
List<Map<String, Object>> dataList = winnings.stream()
.filter(winning -> winning.getPostTime() != null)
.map(winning -> {
Calendar rightNow = Calendar.getInstance();
rightNow.setTime(winning.getPostTime());
rightNow.add(Calendar.MONTH, 1);
boolean flag = rightNow.getTime().compareTo(new Date()) <= 0;
if (!VtuzxUtil.isEmpty(winning.getOutState()) && winning.getOutState().equals(String.valueOf(PrizeOutStateEnum.Sent_ENUM.value())) && flag) {
winningDao.updOutStateById(String.valueOf(winning.getId()), PrizeOutStateEnum.Receive_Goods.value());
winning.setOutState(PrizeOutStateEnum.Receive_Goods.value());
flag = false;
}
return new VtuzxMap("prizeName", winning.getPrizeName())
.append("receiptNo", winning.getReceiptNo())
.append("companyName", winning.getCompanyName())
.append("department", winning.getDepartment())
.append("prizeNum", winning.getPrizeNum())
.append("outStore", winning.getOutStore())
.append("giveOut", winning.getGiveOut())
.append("userName", winning.getUserName())
.append("activityName", winning.getActivityName())
.append("outState", winning.getOutState())
.append("mobile", winning.getMobile())
.append("activityId", winning.getAwardActivityId())
.append("prizeType", winning.getPrizeType())
.append("clearingState", winning.getClearingState())
.append("postCompany", winning.getPostCompany())
.append("storeName", winning.getStoreName())
.append("postNo", winning.getPostNo())
.append("postName", winning.getPostName())
.append("contactMobile", winning.getContactMobile())
.append("province", winning.getProvince())
.append("city", winning.getCity())
.append("area", winning.getArea())
.append("createdAt", VtuzxUtil.formatYmdHmsF(winning.getCreatedAt()))
.append("addressDetail", winning.getAddressDetail());
})
.collect(Collectors.toList());
```
使用 stream 可以让代码更加简洁和易于理解,同时也有更好的可读性和可维护性。
如何利用Java Stream的collect方法实现部门分组,并在分组基础上筛选出子公司员工?请提供一个完整的示例。
在项目实战中,Java Stream的collect方法是处理集合数据的强大工具,尤其在需要进行复杂数据聚合和分组时。为了帮助你实现部门分组并筛选出子公司员工的需求,推荐查阅《深入解析JAVA Stream的collect功能及实战应用》。这篇资料详细介绍了collect方法的高级使用技巧,对于解决你当前面临的问题有着直接的指导意义。
参考资源链接:[深入解析JAVA Stream的collect功能及实战应用](https://wenku.csdn.net/doc/7p74nk5m8v?spm=1055.2569.3001.10343)
首先,假设你有一个Employee类,它包含部门和是否属于子公司的属性。你可以使用以下步骤来实现部门分组,并筛选出子公司的员工:
1. 使用stream()方法对员工列表进行流处理。
2. 利用filter()方法筛选出属于子公司的员工。
3. 应用collect()方法,并通过Collectors.groupingBy()实现按部门分组的功能。
4. 使用Collectors.filtering()方法在分组后进一步筛选出子公司员工。
示例代码如下:
```java
Map<String, List<Employee>> departmentToEmployees = employees.stream()
.filter(Employee::isSubsidiary) // 筛选出子公司的员工
.collect(Collectors.groupingBy(
Employee::getDepartment, // 按部门进行分组
Collectors.filtering(Employee::isSubsidiary, Collectors.toList()) // 在每个分组内部继续筛选子公司员工
));
```
在这个示例中,我们首先通过`filter(Employee::isSubsidiary)`筛选出子公司的员工,然后使用`groupingBy`收集器按键函数`Employee::getDepartment`将员工按部门分组。在`groupingBy`的下游收集器中,我们再次使用`filtering`收集器筛选出每个部门中属于子公司的员工。这样,`departmentToEmployees`最终是一个映射,键是部门名称,值是该部门中所有子公司的员工列表。
通过对collect方法的深入理解和灵活运用,你可以优雅地处理复杂的数据聚合需求。为了进一步提升你的Java Stream技能,建议继续阅读《深入解析JAVA Stream的collect功能及实战应用》,它不仅提供了collect方法的详细讲解,还包括了大量实际应用案例,让你在实战中更加得心应手。
参考资源链接:[深入解析JAVA Stream的collect功能及实战应用](https://wenku.csdn.net/doc/7p74nk5m8v?spm=1055.2569.3001.10343)
阅读全文