JDK8新特性之方法引用

方法引用的几种常用方式

应用场景:如果Lambda表达式所要实现的方案,已经有其他方法存在相同的方案,那么则可以使用方法引用.

符号表示: ::

符号说明:双冒号为方法引用运算符,而它所在的表达式被称为方法引用。

常用的引用方式:

1、instanceName::methodName 对象::方法名

2、ClassName::staticMethodName 类名::静态方法

3、ClassName::MethodName 类名::普通方法

4、ClassName::new 类名::new 调用的构造器

5、TypeName[]::new String[]::new 调用数组构造器

方法引用的注意事项
        1. 被引用的方法,参数要和接口中抽象方法的参数一样
        2. 当接口抽象方法有返回值时,被引用的方法也必须有返回值

对象名::引用成员方法

        当一个类中已经存在成员方法,我们需要使用时,可以使用方法引用的方式.

 //对象名引用成员方法  对象名::方法名
    @Test
    public  void testObject(){
        Date date = new Date();
        //使用Lambda表达式方式
        Supplier<Long> sup  = ()->{
            return  date.getTime();
        };
        System.out.println("时间 :"+sup.get());

        //使用方法引用 简写上述Lambda表达式
        Supplier<Long> supp = date::getTime;
        System.out.println("supp : "+supp.get());
    }

 类名::引用静态方法

        当某个类中已经存在我们需要使用的静态方法时,就可以直接使用方法引用的方式

//方法引用之类名调用静态方法  类名::静态方法
    @Test
    public void test2(){
        Supplier<Long> sup = System::currentTimeMillis;
        System.out.println("sup : "+sup.get());
    }

类名::引用实例方法

java面向对象中,类名只能调用静态方法,而类名引用实例方法,需要使用第一个参数作为方法的调用者

    //方法引用之实例方法引用  实际上是拿第一个参数作为方法的调用者  类名::方法名
    @Test
    public void test3(){
        Function<String,Integer> fun = (s)->{
            return s.length();
        };
        System.out.println("fun : "+fun.apply("hello"));
        //使用类名::方法名  进行方法引用操作
        Function<String,Integer> fun2 = String::length;
        System.out.println("fun2 : "+fun2.apply("dongdong"));
        BiFunction<String,Integer,String> bi = String::substring;
        System.out.println("bi :"+bi.apply("hello",2));
    }

 类名::new  引用类构造器

构造器名称和类名完全一致,所以调用构造器时使用  类名称::new 的格式。先造个类Person

public class Person {
    private String name;
    private Integer age;

    public Person() {
    }

    public Person(String name) {
        this.name = name;
    }

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

 然后通过方法引用调用该类的构造器

    //方法引用之构造方法引用  类名::new
    @Test
    public void test4(){
        Supplier<Person> sup = ()->{
           return new Person();
        };
        System.out.println("sup : "+sup.get());
        //方法引用调用构造器
        Supplier<Person> supp = Person::new;
        System.out.println("supp : "+supp.get());
        //方法引用调用带参构造器
        BiFunction<String,Integer,Person> bi = Person::new;
        System.out.println("bi : "+bi.apply("张三",18));
    }

数组::new  引用数组构造器

数组也是Object的子类对象,所以同样具有构造器,只是语法不一样罢了。

    //方法引用之数组构造方法引用  String[]::new 调用数组构造器  String[]可以是其他类型的构造器
    @Test
    public void test5(){
        Function<Integer,String[]> fun = (len)->{
            return new String[len];
        };
        System.out.println("fun : "+fun.apply(10));
        
        //方法引用  数组构造器 
        Function<Integer,String[]> fun2 = String[]::new;
        String[] arr = fun2.apply(10);
        System.out.println("arr :"+arr.length);
    }

方法引用实际是对Lambda表达式复合特定情况下的一种缩写形式,使Lambda表达式更加简洁,但需要注意的是方法引用的方法是必须要存在的方法才行。

路漫漫其修远兮,吾将上下而求索,希望该篇文章对大家有所帮助.......

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值