爽的上天的lambda,你会用?牛,不妨看看你用过没

Posted 辉常努腻

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爽的上天的lambda,你会用?牛,不妨看看你用过没相关的知识,希望对你有一定的参考价值。

最近在业务代码中写了一些没用过的lambda表达式,今天放出来一个例子:看一下我用的那个lambda?

stream.collect()
<R> R collect(Supplier<R> supplier,BiConsumer<R, ? super T> accumulator,BiConsumer<R, R> combiner);

官方解释!->

个人大白话解释!->
第一个匿名函数用来创建一个最终的容器
第二个函数用来创建一个容器和stream流的每一项进行处理,放入这个容器里
第三个函数用来将,每一个容器全部装到一个容器里
上业务代码

        //权限页面LIst
        List<AppDirectoryPageVo> appDirectoryPageVos = new ArrayList<>();
        if (Objects.nonNull(one) && StringUtils.isNotEmpty(one.getAppDirectory())) 
            //使用lambda表达式  <R> R collect(Supplier<R> supplier,BiConsumer<R, ? super T> accumulator,BiConsumer<R, R> combiner); 生成应用页面目录list
            appDirectoryPageVos.addAll(
                    Arrays.stream(one.getAppDirectory().split(",")).collect(
                            //生成一个容器
                            new Supplier<List<AppDirectoryPageVo>>() 
                                @Override
                                public List<AppDirectoryPageVo> get() 
                                    return new ArrayList<>();
                                
                            ,
                            //将每一个目录VO装入单独List对象
                            new BiConsumer<List<AppDirectoryPageVo>, String>() 
                                @Override
                                public void accept(List<AppDirectoryPageVo> appDirectoryPageVoList, String appDirectory) 
                                    AppDirectoryPageVo json = new AppDirectoryPageVo();
                                    json.setDirectory(appDirectory);
                                    appDirectoryPageVoList.add(json);

                                
                            ,
                            //将每一个容器和到一个容器
                            new BiConsumer<List<AppDirectoryPageVo>, List<AppDirectoryPageVo>>() 
                                @Override
                                public void accept(List<AppDirectoryPageVo> appDirectoryPageVoList, List<AppDirectoryPageVo> appDirectoryPageVoList2) 
                                    appDirectoryPageVoList.addAll(appDirectoryPageVoList2);
                                
                            )
            );
        


这个是我第一次写出来的代码,又臭又长,但是加上我的注释,就能理解了,再看一下我配合IDEA提示优化的代码,我其实不太喜欢,可读性太低了

        //权限页面LIst
        List<AppDirectoryPageVo> appDirectoryPageVos = new ArrayList<>();
        if (Objects.nonNull(one) && StringUtils.isNotEmpty(one.getAppDirectory())) 
            //使用lambda表达式  <R> R collect(Supplier<R> supplier,BiConsumer<R, ? super T> accumulator,BiConsumer<R, R> combiner); 生成应用页面目录list
            appDirectoryPageVos.addAll(
                    Arrays.stream(one.getAppDirectory().split(",")).collect(
                            //生成一个容器
                            (Supplier<List<AppDirectoryPageVo>>) ArrayList::new,
                            //将每一个目录VO装入单独List对象
                            (appDirectoryPageVoList, appDirectory) -> 
                                AppDirectoryPageVo json = new AppDirectoryPageVo();
                                json.setDirectory(appDirectory);
                                appDirectoryPageVoList.add(json);

                            ,
                            //将每一个容器和到一个容器
                            List::addAll)
            );
        

这里就介绍完了我的使用过程,你还有那些不懂嫩?
再来一些教程把,有的是沾别人的,其实你们按我的第一个例子,又臭又长的又有注释的去用,稍微改改自己的业务
解读:

Supplier 提供容器,供后续accumulator和combiner使用

accumulator 处理Supplier提供的T容器和stream中的元素U

combiner 用来将所有accumulator处理后的结果T进行处理

以上是关于爽的上天的lambda,你会用?牛,不妨看看你用过没的主要内容,如果未能解决你的问题,请参考以下文章

Python常用的6大工具,你会用哪些?

Python常用的6大工具,你会用哪些?

华为手机有5种截屏方式,你会用几种呢?用过3种以上的手机没白买

Github 高级搜索技巧,看看你用过几个?

如果你用Win10打游戏觉得卡顿,不妨开启卓越性能模式看看

26 款阿里超神 Java 开源项目,看看你用过几个?