在Java8中,我们可以直接通过方法引用来简写lambda表达式中已经存在的方法。

Arrays.sort(stringsArray, String::compareToIgnoreCase);

这种特性就叫做方法引用(Method Reference)。

方法引用的形式

方法引用的标准形式是:类名::方法名。(注意:只需要写方法名,不需要写括号

有以下四种形式的方法引用:

类型 示例
引用静态方法 ContainingClass::staticMethodName
引用某个对象的实例方法 containingObject::instanceMethodName
引用某个类型的任意对象的实例方法 ContainingType::methodName
引用构造方法 ClassName::new

下面我们通过一个小Demo来分别学习这几种形式的方法引用:

public class Person { 
    public enum Sex{ 
        MALE,FEMALE 
    } 
 
    String name; 
    LocalDate birthday; 
    Sex gender; 
    String emailAddress; 
 
    public String getEmailAddress() { 
        return emailAddress; 
    } 
 
    public Sex getGender() { 
        return gender; 
    } 
 
    public LocalDate getBirthday() { 
        return birthday; 
    } 
 
    public String getName() { 
        return name; 
    } 
 
    public static int compareByAge(Person a,Person b){ 
        return a.birthday.compareTo(b.birthday); 
    } 
 
}

引用静态方法

Person [] persons = new Person[10]; 
 
//使用匿名类 
Arrays.sort(persons, new Comparator<Person>() { 
            @Override 
            public int compare(Person o1, Person o2) { 
                return o1.birthday.compareTo(o2.birthday); 
            } 
 }); 
 
//使用lambda表达式 
Arrays.sort(persons, (o1, o2) -> o1.birthday.compareTo(o2.birthday)); 
 
//使用lambda表达式和类的静态方法 
Arrays.sort(persons, (o1, o2) -> Person.compareByAge(o1,o2)); 
 
//使用方法引用 
//引用的是类的静态方法 
Arrays.sort(persons, Person::compareByAge);

引用对象的实例方法

class ComparisonProvider{ 
            public int compareByName(Person a,Person b){ 
                return a.getName().compareTo(b.getName()); 
            } 
 
            public int compareByAge(Person a,Person b){ 
                return a.getBirthday().compareTo(b.getBirthday()); 
            } 
        } 
 
ComparisonProvider provider = new ComparisonProvider(); 
 
//使用lambda表达式 
//对象的实例方法 
Arrays.sort(persons,(a,b)->provider.compareByAge(a,b)); 
 
//使用方法引用 
//引用的是对象的实例方法 
Arrays.sort(persons, provider::compareByAge); 
引用类型对象的实例方法 
String[] stringsArray = {"Hello","World"}; 
 
//使用lambda表达式和类型对象的实例方法 
Arrays.sort(stringsArray,(s1,s2)->s1.compareToIgnoreCase(s2)); 
 
//使用方法引用 
//引用的是类型对象的实例方法 
Arrays.sort(stringsArray, String::compareToIgnoreCase);

引用构造方法

public static <T, SOURCE extends Collection<T>, DEST extends Collection<T>> 
    DEST transferElements(SOURCE sourceColletions, Supplier<DEST> colltionFactory) { 
        DEST result = colltionFactory.get(); 
        for (T t : sourceColletions) { 
            result.add(t); 
        } 
        return result; 
    } 
... 
  
final List<Person> personList = Arrays.asList(persons); 
 
//使用lambda表达式 
Set<Person> personSet = transferElements(personList,()-> new HashSet<>()); 
 
//使用方法引用 
//引用的是构造方法 
Set<Person> personSet2 = transferElements(personList, HashSet::new); 

数组构造方法引用

组成语法格式:TypeName[]::new

例子:

int[]::new 是一个含有一个参数的构造器引用,这个参数就是数组的长度。等价于lambda表达式  x -> new int[x]。

假想存在一个接收int参数的数组构造方法

IntFunction<int[]> arrayMaker = int[]::new; 
int[] array = arrayMaker.apply(10) // 创建数组 int[10]
 
 
 


发布评论
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

Java 8 ------------ Lambda 表达式知识解答
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。