函数和并发流的结合使用

2023-07-28  本文已影响0人  zxbyh

一 场景:比如说这儿要获取sku的信息,要根据属性定义id和属性值id获取到对应的信息。其实这两个没有关系,就可以使用并发执行。
1 不使用并发的实现

    private String _loadSkuInfoOne(String skuSpecDefIdAndValId){
        String defId = StringUtils.substringBefore(skuSpecDefIdAndValId,":");
        String valId = StringUtils.substringAfter(skuSpecDefIdAndValId,":");

        String spName = itemDao.tbSpecDef.rowOptional(Convert.toLong(defId)).map(x->x.s("spName")).orElse("");
        String spvName = itemDao.tbSpecVal.rowOptional(Convert.toLong(valId)).map(x->x.s("spvName")).orElse("");

        return spName+":"+spvName;
    }

2 使用并发实现的方法一:

    private String _loadSkuInfoOne(String skuSpecDefIdAndValId){
        String defId = StringUtils.substringBefore(skuSpecDefIdAndValId,":");
        String valId = StringUtils.substringAfter(skuSpecDefIdAndValId,":");

        List<Supplier<String>> supplierList = List.of(
            ()->itemDao.tbSpecDef.rowOptional(Convert.toLong(defId)).map(x->x.s("spName")).orElse(""),
            ()->itemDao.tbSpecVal.rowOptional(Convert.toLong(valId)).map(x->x.s("spvName")).orElse("")
        );
        return supplierList.parallelStream().map(x->x.get()).collect(Collectors.joining(":"));
    }

3 使用并发实现的方法二

    private String _loadSkuInfoOne(String skuSpecDefIdAndValId){
        String defId = StringUtils.substringBefore(skuSpecDefIdAndValId,":");
        String valId = StringUtils.substringAfter(skuSpecDefIdAndValId,":");

        AtomicReference<String> spName = new AtomicReference<>();
        AtomicReference<String> spvName = new AtomicReference<>();
        List<Runnable> runnableList = List.of(
            ()->spName.set(itemDao.tbSpecDef.rowOptional(Convert.toLong(defId)).map(x -> x.s("spName")).orElse("")),
            ()->spvName.set(itemDao.tbSpecVal.rowOptional(Convert.toLong(valId)).map(x->x.s("spvName")).orElse(""))
        );
        runnableList.parallelStream().forEach(x->x.run());
        return spName.get()+":"+spvName.get();
    }
上一篇 下一篇

猜你喜欢

热点阅读