欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java8 lambda和方法引用示例

程序员文章站 2022-05-28 20:46:16
...
public class Test {

    protected interface FunctionEx {
        void execute(String a);

        default void defaultMethod() {
            System.out.println("FunctionEx default executed!");
        }
    }


    public String saySomething(String a) {
        System.out.println("say :" + a);
        // 当前FunctionEx.execute返回void,saySomething有返回值不影响方法引用,
        // 当FunctionEx.execute有返回值,则saySomething返回值类型必须与之相同,
        // 否则不能引用
        return "";
    }

    public void doTest(String a, FunctionEx functionEx) {
        System.out.print("doTest ");
        functionEx.execute(a);
    }

    public void doTest2(String a) {

        doTest(a, this::saySomething);
        doTest(a, n -> this.saySomething(n)); // 此处this可省略
        doTest(a, n -> saySomething(n));
        doTest(a, new FunctionEx() {
            @Override
            public void execute(String a) {
                // this.saySomething(a);
                // 匿名内部类的this指向匿名内部类,所以此处不能用this.saySomething
                // lambda的this指针指向的是包围lambda表达式的类
                saySomething(a);
            }
        });
    }


    public static void main(String[] args) {
        String str = "hello";

        Test test = new Test();

        test.doTest(str, n -> test.saySomething(n));
        test.doTest(str, test::saySomething); // 方法引用的方式可以简化lambda表达式的写法
        // 可使用方法引用的前提:lambda的主体仅包含一个表达式,且该表达式仅调用了一个已经存在的方法。
        test.doTest(str, n -> {
            test.saySomething(n);
            // defaultMethod(); // lambda表达式不能调用接口中的默认方法
        });
        test.doTest(str, new FunctionEx() {
            @Override
            public void execute(String a) {
                test.saySomething(a);
                defaultMethod();// 匿名类实现的抽象方法允许调用接口中的默认方法
            }
        });


        System.out.println("doTest2 start");
        test.doTest2(str);
    }

}
相关标签: java