//获取当前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-13 13:24:54 浏览: 50
这段代码是用于获取当前sku的规格信息,并根据规格信息过滤sku属性值。首先,代码从skuList中获取第一个sku的规格列表,然后将规格id和规格值id组成的Pair进行去重,得到pairList。
接下来,代码从respVo中获取spuSpecList,即商品的规格列表。然后,通过flatMap将每个规格的规格值列表展开为一个流,再通过filter过滤掉不符合pairList中规格id和规格值id的规格值。最后,将过滤后的规格值列表收集为一个新的列表spuSpecValues。
接着,代码将spuSpecValues转换为一个Map,以规格id为key,规格值为value。然后,再次遍历spuSpecList,通过peek操作将每个规格的规格值列表设置为只包含符合条件的规格值。最后,将处理后的spuSpecList收集为一个新的列表。
这段代码的作用是根据当前sku的规格信息来过滤商品的规格属性值,以便在页面展示时只显示与当前sku相关的规格属性。
相关问题
//获取当前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());优化
这段代码可以进行一些优化,可以避免重复遍历和创建临时列表。
```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`。
这样,我们避免了重复遍历和创建临时列表,提高了代码的效率。
解释代码 List<String> skus = skuList.stream().map(ProductSkuDTO::getSku).collect(Collectors.toList())
这行代码使用了Java 8中的Stream API,对一个名为skuList的List<ProductSkuDTO>进行了操作,通过map方法将每个ProductSkuDTO对象转换为其对应的sku属性,然后将转换后的sku属性收集到一个List<String>中。
具体来说,map方法接收一个Function接口作为参数,用于将每个ProductSkuDTO对象映射为其sku属性,这个Function接口使用了Java 8中的方法引用,即ProductSkuDTO::getSku表示调用ProductSkuDTO对象的getSku方法。
最后,collect方法接收一个Collector接口作为参数,用于将Stream中的元素收集为一个集合。在这里,使用了Collectors.toList()方法,将Stream中的元素收集到一个List<String>集合中。
阅读全文