优化:Map<String,Integer> stringStream = supplyGoodsMapper.querySupplyGoodsIdNo(tenantId, supplyGoodsIds).stream().filter(sg -> Objects.equals(sg.getDeliveryWay(), DeliveryWayEnum.PLATFORM_DELIVERY)).collect(Collectors.toMap(SupplyGoodsIdNoDTO::getSupplyGoodsNo,0))
时间: 2024-02-12 13:03:28 浏览: 134
有两个问题需要优化:
1. `Collectors.toMap` 方法的第二个参数应该传入一个 `Function`,而不是直接传入 0。因为这个参数是用来指定 Map 的 value 的类型的,默认是 Object 类型,但是我们想要的是 Integer 类型,因此应该使用 `sg -> 0` 的 Lambda 表达式来指定。
2. 在使用 `Collectors.toMap` 时,如果遇到 key 重复的情况,会抛出 `IllegalStateException` 异常。因此,我们需要在 `toMap` 方法中传入一个合适的 merge function 来处理 key 重复的情况。在这里,我们可以使用 `Integer::sum` 方法,将两个 value 相加。
下面是优化后的代码:
```
Map<String, Integer> stringStream = supplyGoodsMapper.querySupplyGoodsIdNo(tenantId, supplyGoodsIds)
.stream()
.filter(sg -> Objects.equals(sg.getDeliveryWay(), DeliveryWayEnum.PLATFORM_DELIVERY))
.collect(Collectors.toMap(SupplyGoodsIdNoDTO::getSupplyGoodsNo, sg -> 0, Integer::sum));
```
相关问题
优化以下代码: Map<Long, Integer> pNumMap = new HashMap<>(); supplyGoodsMapper.supplyGoodsListForPurchaseOrder(tenantId, numMap.keySet(), null).stream() .filter(Objects::nonNull) .forEach(supplyGoods->{ if (Objects.nonNull(numMap.get(supplyGoods.getSupplyGoodsNo()))){ pNumMap.put(supplyGoods.getSupplyGoodsId(),numMap.get(supplyGoods.getSupplyGoodsNo())); } });
可以尝试以下优化:
1. 将 Map<Long, Integer> numMap 转化为 Set<Long>,减少后续操作中对 Map 的操作。
2. 使用 forEach 遍历 List 可能会影响性能,建议使用 stream 的 forEach 方法并行执行。
3. 可以使用 filter 代替 if 判断,提高代码的可读性和简洁性。
优化后的代码如下:
```
Set<Long> supplyGoodsNoSet = numMap.keySet();
Map<Long, Integer> pNumMap = supplyGoodsMapper.supplyGoodsListForPurchaseOrder(tenantId, supplyGoodsNoSet, null)
.parallelStream()
.filter(Objects::nonNull)
.filter(sg -> supplyGoodsNoSet.contains(sg.getSupplyGoodsNo()))
.collect(Collectors.toMap(SupplyGoods::getSupplyGoodsId, sg -> numMap.get(sg.getSupplyGoodsNo())));
```
优化以下代码: Set<Long> goodsCategoryId = new HashSet<>(); if (!CollectionUtils.isEmpty(goodsCategoryIds)) { Map<Long, CategoryCache> categoryMap2 = this.categoryService.categoryMap(tenantId, goodsCategoryIds); goodsCategoryIds.forEach(c -> { if (Objects.isNull(categoryMap2.get(c))) { return; } else { CategoryCache categoryCache1 = categoryMap2.get(c); String[] split = categoryCache1.getIdPaths().split("-"); List<String> strings = Arrays.asList(split); Set<Long> categoryId = strings.stream().map(Long::parseLong).collect(Collectors.toSet()); goodsCategoryId.addAll(categoryId); } }); }
可以优化的地方有:
1. 使用 lambda 表达式来简化代码。
2. 如果 goodsCategoryIds 不为空,则先获取 categoryMap2,避免重复获取。
3. 使用 containsKey 来判断 Map 中是否存在某个 key。
4. 将 split 和 Arrays.asList(split) 合并为一行代码。
5. 使用 flatMap 来将 List<Long> 转换为 Set<Long>。
6. 将 forEach 替换为 stream。
优化后的代码如下:
```
Set<Long> goodsCategoryId = new HashSet<>();
if (!CollectionUtils.isEmpty(goodsCategoryIds)) {
Map<Long, CategoryCache> categoryMap2 = this.categoryService.categoryMap(tenantId, goodsCategoryIds);
goodsCategoryIds.stream()
.filter(categoryMap2::containsKey)
.map(categoryMap2::get)
.map(CategoryCache::getIdPaths)
.map(idPaths -> Arrays.stream(idPaths.split("-")).map(Long::parseLong).collect(Collectors.toSet()))
.flatMap(Collection::stream)
.forEach(goodsCategoryId::add);
}
```
阅读全文