其他分享
首页 > 其他分享> > lambda VS 匿名类 节选1

lambda VS 匿名类 节选1

作者:互联网


两个静态方法


    public static List<String> addElementsToList(List<String> list) {
        for (int i = 0; i < 22; i++) {
            list.add("str" + i);
        }
        return list;
    }

    private static void processString(String str) {
        System.out.println(str);
    }

普通输出集合方式

        List<String> myList = addElementsToList(new ArrayList<>());
        String outside = "outside string";

        for (String s : myList) {
            processString(outside + s);
        }

匿名内部类版本

        // TODO 匿名内部类版
        myList.forEach(
                new Consumer<String>() {
                    @Override
                    public void accept(String s) {
                        processString(outside + s);
                    }
                }
        );

lambda完整版

        // TODO lambda的表达式必须能够符合接口中定义的抽象方法,从参数,到返回值,到异常,都必须匹配

        // TODO lambda 完整版 (参数) -> {代码块}
        // TODO lambda可以有返回值,使用return语句就可以,当然我们这个接口没有,我们的lambda表达式也不能有
        // TODO lambda可以使用外部数据,怎么看都和匿名内部类是一样的
        myList.forEach(
                (s) -> {
                    processString(outside + s);
                }
        );

lambda简化版,去除了参数后大括号

        // TODO lambda 单参数,代码单行 简化版,
        myList.forEach(s -> processString(outside + s));

lambda终极版,如果不使用外部变量

        // TODO lambda 如果不使用外部变量,还有方法引用终极简化版
        myList.forEach(IterateListLambdaAppMain::processString);

lambda终极版,不是静态方法的话


        // TODO lambda 方法引用终极简化版:不是静态方法,用引用也可以
        IterateListLambdaAppMain inst = new IterateListLambdaAppMain();
        myList.forEach(inst::processStringInst);

        private void processStringInst(String str) {
              System.out.println(str);
        }
        // TODO lambda也允许指定一个参数类型里的一个方法作为方法的引用
        myList.forEach(String::toUpperCase);
   

标签:myList,String,节选,outside,VS,forEach,TODO,lambda
来源: https://blog.51cto.com/u_11956468/3014346