//获取当前sku的规格 List<Pair<Long, String>> pairList = skuList.get(0).getSpecList().stream().map(item -> Pair.of(item.getSpecId(), item.getSpecValueId())).distinct().collect(Collectors.toList()); //过滤sku属性值 List<SpuSpecValueVo> spuSpecList = respVo.getSpuSpecList(); List<SpuSpecValue> spuSpecValues = spuSpecList.stream(). map(SpuSpecValueVo::getSpecValues). flatMap(Collection::stream). filter(spuSpecValueVo -> pairList.contains(Pair.of(spuSpecValueVo.getSpecId(), String.valueOf(spuSpecValueVo.getSpecValueId())))). collect(Collectors.toList()); Map<Long, SpuSpecValue> spuSpecValueMap = spuSpecValues.stream().collect(Collectors.toMap(SpuSpecValue::getSpecId, Function.identity(), (v1, v2) -> v1)); spuSpecList.stream(). peek(spuSpecValueVo -> spuSpecValueVo.setSpecValues(Lists.newArrayList(spuSpecValueMap.get(spuSpecValueVo.getId())))). collect(Collectors.toList());优化
时间: 2024-04-12 13:30:30 浏览: 120
这段代码可以进行一些优化,可以避免重复遍历和创建临时列表。
```java
// 获取当前sku的规格
List<Pair<Long, String>> pairList = skuList.get(0).getSpecList()
.stream()
.map(item -> Pair.of(item.getSpecId(), item.getSpecValueId()))
.distinct()
.collect(Collectors.toList());
// 过滤sku属性值
List<SpuSpecValueVo> spuSpecList = respVo.getSpuSpecList();
Map<Long, List<SpuSpecValueVo>> spuSpecValueMap = spuSpecList
.stream()
.collect(Collectors.groupingBy(SpuSpecValueVo::getSpecId));
spuSpecList.forEach(spuSpecValueVo -> {
List<SpuSpecValue> specValues = spuSpecValueMap.getOrDefault(spuSpecValueVo.getId(), Collections.emptyList())
.stream()
.filter(spuSpecValue -> pairList.contains(Pair.of(spuSpecValue.getSpecId(), String.valueOf(spuSpecValue.getSpecValueId()))))
.collect(Collectors.toList());
spuSpecValueVo.setSpecValues(specValues);
});
```
在优化后的代码中,我们使用`Collectors.groupingBy`将`spuSpecList`按照规格id分组,得到一个以规格id为key,规格值列表为value的Map。这样就避免了多次遍历寻找匹配的规格值。
然后,我们使用`forEach`遍历`spuSpecList`,对每个规格进行处理。通过`spuSpecValueMap`获取对应的规格值列表,然后过滤掉不符合条件的规格值,最后将处理后的规格值列表设置回`spuSpecValueVo`。
这样,我们避免了重复遍历和创建临时列表,提高了代码的效率。
阅读全文