java8 stream 分组后数据处理避免空指针异常

974 阅读1分钟

使用java8 Steama相关api在一些涉及集合处理的逻辑可以得到很大程度的简化,在处理一对多关系的数据时,经常会用到分组功能,下面用例子说明。

ProductLabel为商品标签,定义为

public class ProductLabel {
    private Long id;
    /**
     * sku编码
     */
    private String sku;
    /**
     * 标签名
     */
    private String name;
    /**
     * 标签值
     */
    private String value;
}

步骤一:对List类型labels按sku进行分组

Map<String, List<ProductLabel>> skuLabelMap = 
labels.stream().collect(Collectors.groupingBy(ProductLabel::getSku));

步骤二:根据sku从分组取值并处理

方式一:

List<ProductLabel> skuLabels = skuLabelMap.get(skuCode);
//通过skuCode从skuLabelMap获取到值为List,可能为空,为了避免空指针异常,
//对List进行for循环操作一般都会在前面做判空操作
if (CollectionUtils.isNotEmpty(skuLabels)) {
    for (ProductLabel skuLabel : skuLabels) {
        //todo:
    }
}

方式二:

List<ProductLabel> skuLabels = skuLabelMap.getOrDefault(skuCode, Collections.emptyList());
for (ProductLabel skuLabel : skuLabels) {
    //todo:
}

方式一也可以避免空指针异常,不过需要嵌多一层if代码块,代码没那么好看,方式二利用Map的getOrDefault方法找不到key对应的值则返回一个空的List-> Collections.emptyList()