美文网首页
【开发】开发中关于循环的一件小事~

【开发】开发中关于循环的一件小事~

作者: 不喜欢默认头像137 | 来源:发表于2020-03-13 15:13 被阅读0次

    小事的背景

    在日常业务开发的过程中,大家肯定有把一个List转成另外一个List的场景,Java8出了很久,流这个新的特性大家玩的也特别好了,所以这种场景,大家写的越来越🌹🍐🐯🔥~
    知道有一天,一个十年资深Java高级开发工程师甩给我一个分支,让我学习,我看到了下面这段代码~


    代码

    为了狗命,所以代码打了厚🐎,大佬们凑活看,心中无🐎,自然万物无🐎
    然后我就开始分析了。


    image.png
    image.png
    image.png
    image.png

    经过一顿分析后,分析失败,不过大佬这么写一定有大佬的道理,但是咱也不敢问,本着热爱学习的态度,我觉得做个实验。


    image.png

    讲理咱嘴笨,就喜欢敲代码

    image.png

    菜狗一顿操作,做个实验吧

    public class Solution {
        private static List<String> strings;
    
        static {
            strings = new ArrayList<>();
            for (int i = 0; i < 10000; i++) {
                strings.add(i + "");
            }
        }
    
        private static List<Integer> resultStrings = new ArrayList<>();
    
        /**
         * 不用啥新特性,老老实实用循环 朴实无华
         */
        private static void function1() {
            StopWatch stopWatch = new StopWatch();
            stopWatch.start();
    
            for (String s : strings) {
                resultStrings.add(Integer.valueOf(s));
            }
            stopWatch.stop();
            log.info("朴实无华 result size = {}, cost time = {}", resultStrings.size(), stopWatch.getNanoTime());
    
        }
    
        /**
         * 资深开发工程师 写法
         */
        private static void function2() {
            StopWatch stopWatch = new StopWatch();
            stopWatch.start();
    
            strings.stream().forEach(a -> {
                Integer i = Integer.valueOf(a);
                resultStrings.add(i);
            });
    
            stopWatch.stop();
            log.info("资深开发 result size = {}, cost time = {}", resultStrings.size(), stopWatch.getNanoTime());
    
        }
    
        /**
         * 常规流的应用
         */
        private static void function3() {
            StopWatch stopWatch = new StopWatch();
            stopWatch.start();
    
            resultStrings = strings.stream().map(Integer::new).collect(Collectors.toList());
    
            stopWatch.stop();
            log.info("常规写法 result size = {}, cost time = {}", resultStrings.size(), stopWatch.getNanoTime());
    
        }
    
        /**
         * 开始实验吧
         *
         * @param args
         */
        public static void main(String[] args) {
            log.info("现在是北京时间 = {}", LocalDateTime.now());
            function1();
            function2();
            function3();
        }
    }
    

    整理一下实验结果

    实验序号 结果
    1
    2
    3
    4
    5
    image.png

    感觉分析不出来~~ 然后把List扩大到一百万,然后循环20次这个实验,结论




    一顿操作之后,我发现,这三种写法在时间上其实都有快有慢,真的说不好~~

    结尾

    从效率上很难说谁快谁慢,各有优劣,而且循环百万List的场景也不是很常见,日常开发循环的哪些数组也难从这种细节写法上优化多少多少。
    但就从写法上来说,个人觉得不太好看,都已经用了流了,还是想生成另外一个数组的这种场景,为什么不用map?是因为不香么?

    菜逼小开发,在这瞎bb一通,各位大佬轻点喷,如果有谁能知道这种写法的好处,求指导~

    菜逼小开发,在这瞎bb一通,各位大佬轻点喷,如果有谁能知道这种写法的好处,求指导~

    菜逼小开发,在这瞎bb一通,各位大佬轻点喷,如果有谁能知道这种写法的好处,求指导~

    相关文章

      网友评论

          本文标题:【开发】开发中关于循环的一件小事~

          本文链接:https://www.haomeiwen.com/subject/jsvhshtx.html