java面试 双冒号之方法引用

双冒号之方法引用
Integer::parseInt;
Integer::new;
以上两种写法是什么意思?

写法的演变
首先我们需要定义一个接口:

interface Demo{
    int method(String s);
}

1、匿名内部类
使用匿名内部类的方法定义一个对象,如下:

Demo demo1 = new Demo() {
            @Override
            public int method(String s) {
                return Integer.parseInt(s);
            }
        };
        int v1 = demo1.method("111");
        System.out.println(v1);

2、lambda表达式
为了简化匿名内部类里的代码,我们可以使用lambda表达式,
因为子类创建后都是Demo类型的,所以new Dem()这一部分我们可以省略掉,自然而然的大括号我们也省去了,@Override也省略,最后就变为了只有一个方法,这个方法的返回值和参数类型是固定不变的,为Demo接口的返回值类型、参数类型,所以返回值类型、参数类型也省略不写了,最终只剩下参数s,我们最终可以简写为以下形式:

Demo demo2 = s -> {
            return  Integer.parseInt(s);
        };
        int v2 = demo2.method("222");
        System.out.println(v2);

3、lambda表达式对应的子类方法中,只有一行代码
如果方法内部只有一行代码,大括号就可以省略不写了,相应的return关键字也可以省去,最终变为以下形式:

 Demo demo3 = s -> Integer.parseInt(s);
 int v3= demo3.method("333");
 System.out.println(v3);

4、lambda表达式对应的子类方法中,只有一行代码,并且此方法是外部定义
如果方法这一行代码不是我们自己写的逻辑,引用了别的类现成的方法,可以使用::表示方法引用,如下:

        Demo demo4 = Integer::parseInt;
        int v4= demo4.method("444");
        System.out.println(v4);

5、lambda表达式对应的子类方法中,只有一行代码,并且此方法是外部定义,并且引用了构造方法
可以写为以下形式:

        Demo demo5 = Integer::new;
        int v5= demo5.method("555");
        System.out.println(v5);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值