java8 lambda和方法引用示例_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > java8 lambda和方法引用示例

java8 lambda和方法引用示例

 2021/7/13 16:09:32  vinnie424  程序员俱乐部  我要评论(0)
  • 摘要:publicclassTest{protectedinterfaceFunctionEx{voidexecute(Stringa);defaultvoiddefaultMethod(){System.out.println("FunctionExdefaultexecuted!");}}publicStringsaySomething(Stringa){System.out.println("say:"+a);//当前FunctionEx.execute返回void
  • 标签:方法 Java
class="java">
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);
    }

}
发表评论
用户名: 匿名