java 8 方法引用

如果Lambda 表达式的代码块只有一行代码,程序就可以省略表达式代码块的花括号,不仅如此,如果只有一行代码,还可以使用方法的引用和构造器的引用
这里写图片描述

下面为四种引用的实例


public class function {

    @FunctionalInterface
    interface Converter{
        /*将String转成int的方法*/
        int converter(String from);
    }


    @FunctionalInterface
    interface Mytest3{
        String mytest3(String a,int b,int c);
    }

    @FunctionalInterface
    interface Mytest4{
        JFrame win(String title);
    }

    public static void main(String[] args) {
        /**
         * 1、引用类方法
         */
        //创建 Converter对象  匿名内部类实现
        Converter converter = new Converter(){
            @Override
            public int converter(String from) {
                return Integer.parseInt(from);
            }
        };

        //创建 Converter对象  Lambda 实现
        converter = from->Integer.valueOf(from);
        //方法引用代替Lambda 表达式
        converter = Integer::valueOf;

        //调用converter 实现
        int number =converter.converter("5");
        System.out.println("整数="+number);

        /**
         * 2、引用特定对象的实例
         */
        //创建 Converter对象  Lambda 实现
        converter = from->"HELLO WORLD".indexOf(from);
        //引用特定对象的实例代替Lambda 表达式
        converter = "HELLO WORLD"::indexOf;

        number =converter.converter("WO");
        System.out.println("索引="+number);
        /**
         *3、引用某类对象的实例方法
         */
        Mytest3 test = (a,b,c)-> a.substring(b, c);

        //引用特定对象的实例代替Lambda 表达式
        /* 引用某类对象的实例方法时注意点:
         * 1、函数式接口中被实现的方法的第一个参数作为调用者
         * 2、后面的参数全部传给改参数作为方法
         * 
         * */
        test = String::substring;

        String subString=test.mytest3("HELLO WORLD", 2, 5);

        System.out.println("截取的字符串为="+subString);
        /**
         * 4、引用构造器
         */
        Mytest4 jfMytest4=title-> new JFrame(title);
        //引用构造器代替Lambda 表达式
        jfMytest4= JFrame::new;

        JFrame jFrame=jfMytest4.win("我的窗口");
        System.out.println(jFrame);
    }
}

lambda 和匿名内部类的区别和联系
lambdab表达式是匿名内部类的简化,因此,可以取代部分匿名内部类。
相同点:
1、都可以直接访问局部变量以及外部类的成员变量
2、创建的匿名对象一样,都可以直接调用,从接口中继承 的默认方法

区别:
1、匿名内部类可以为任意接口创建实例—无论接口中有多少个方法,匿名内部类只需实现即可,lamdba表达式只能为函数式接口创建实例
2、匿名内部类实现的抽象方法中允许调用接口的默认方法,当lambda表达式的代码块中不允许调用接口中定义的默认方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值