Java方法引用

梦想与她 提交于 2019-11-28 20:36:11

1、什么是方法引用


方法引用是一种简写lambda表达式的方式。等同于lambda表达式

如:

List<String> stringsArray = Arrays.asList("sdf","gsdf","gsdf");
Collections.sort(stringsArray, (a,b)-> a.compareToIgnoreCase(b));

可简写为:

List<String> stringsArray = Arrays.asList("sdf","gsdf","gsdf");
Collections.sort(stringsArray, String::compareToIgnoreCase);

这就是方法引用 Java8特性。用::表示

  

2、什么情况下使用


当我们使用lamdba表达式,如果lamdba表达式实现体只调用了一个外部已经存在的方法时。

这种情况 就可以使用方法引用。

如上的例子 lamdba体中只调用了String的compareToIgnoreCase一个方法,就可以使用方法引用

 

3、分类


静态方法引用、实例方法引用、类型的实例方法引用、构造方法引用、数组构造方法引用

 

静态方法引用:

class Zoo{
    private int age;

    public Zoo(int age) {
        this.age = age;
    }
    
    public static int compareZoo(Zoo zoo1, Zoo zoo2){
        return zoo1.age - zoo2.age;
    }
}

public class LamdbaYf {
    public static void main(String[] args){
        List<Zoo> zooArray = Arrays.asList(new Zoo(3),new Zoo(2));
        Collections.sort(zooArray, (zoo1,zoo2) -> Zoo.compareZoo(zoo1,zoo2));
    }
}
View Code

如上使用lamdba方式,改为方法引用:

Collections.sort(zooArray, Zoo::compareZoo);

 

实例方法引用:

例子:

class Zoo{
    private int age;

    public Zoo(int age) {
        this.age = age;
    }

    public  int compareZoo(Zoo zoo1, Zoo zoo2){
        return zoo1.age - zoo2.age;
    }
}

public class LamdbaYf {
    public static void main(String[] args){
        List<Zoo> zooArray = Arrays.asList(new Zoo(3),new Zoo(2));
        Zoo zooInstance = new Zoo(4);
        Collections.sort(zooArray, zooInstance::compareZoo);
    }
}
View Code

 

类型的实例方法引用:

这点写法跟静态方法引用一样,但实际上调用的方法非static

例子:

public class LamdbaYf {
    public static void main(String[] args){
        List<String> strArray = Arrays.asList("aa","cc","bb");
        Collections.sort(strArray, String::compareTo);
    }
}
View Code

相当于lamdba表达式调用时,把第一个参数,作为实例再调用方法:

public class LamdbaYf {
    public static void main(String[] args){
        List<String> strArray = Arrays.asList("aa","cc","bb");
        Collections.sort(strArray, (a,b)->a.compareTo(b));
    }
}
View Code

有点绕,幸运的是 IDEA会自动帮我们检测,自动帮调整为 "类型的实例方法引用"

 

构造方法引用:

例子:

class Zoo{
    private int age=4;

    public int getAge() {
        return age;
    }

}
interface ZooCreate{
    Zoo create();
}

public class LamdbaYf {
    public static void testZoo(ZooCreate zooCreate){
        Zoo zoo = zooCreate.create();
        System.out.println("age="+zoo.getAge());
    }
    public static void main(String[] args){
        testZoo(Zoo::new);
    }
}
View Code

 

数组构造方法引用:

例子:

package com.yangfei.test.lamdba;

class Zoo{
    private int age=4;

    public int getAge() {
        return age;
    }

}
interface ZooCreate{
    Zoo[] create(int num);
}

public class LamdbaYf {
    public static void testZoo(ZooCreate zooCreate){
        Zoo[] zoo = zooCreate.create(5);
        System.out.println("age="+zoo[0].getAge());
    }
    public static void main(String[] args){
        ZooCreate zooCreate = Zoo[]::new;
        testZoo(zooCreate);
    }
}
View Code

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!