java8 lambda和方法引用示例

本文详细探讨了Java中的方法引用和Lambda表达式的使用。通过实例展示了如何在`doTest`方法中调用`saySomething`,并解释了方法引用的简化Lambda表达式的原则。同时,讨论了Lambda表达式不能直接调用接口默认方法的问题以及匿名内部类与Lambda表达式中`this`指针的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);  
    }  
  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值