30分钟入门Java8之方法引用学习

网友投稿 198 2023-05-25


30分钟入门Java8之方法引用学习

前言

之前两篇文章分别介绍了java8的lambda表达式和默认方法和静态接口方法。今天我们继续学习Java8的新语言特性——方法引用(Method References)。

在学习lambda表达式之后,我们通常使用lambda表达式来创建匿名方法。然而,有时候我们仅仅是调用了一个已存在的方法。如下:

Arrays.sort(stringsArray,(s1,s2)->s1.compareToIgnoreCase(s2));

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

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

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

方法引用的形式

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

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

类型

示例

引用静态方法

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() {

@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 = http://new ComparisonProvider();

//使用lambda表达式

//对象的实例方法

Arrays.sort(persons,(a,b)->provider.compareByAge(a,b));

//使用方法引用

//引用的是对象的实例方法

Arrays.sort(persons, pnxMVevrovider::compareByAge);

引用类型对象的实例方法

String[] stringsArray = { "Helhttp://lo" , "World" };

//使用lambda表达式和类型对象的实例方法

Arrays.sort(stringsArray,(s1,s2)->s1.compareToIgnoreCase(s2));

//使用方法引用

//引用的是类型对象的实例方法

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

引用构造方法

public static , DEST extends Collection>

DEST transferElements(SOURCE sourceColletions, Supplier colltionFactory) {

DEST result = colltionFactory.get();

for (T t : sourceColletions) {

result.add(t);

}

return result;

}

...

final List personList = Arrays.asList(persons);

//使用lambda表达式

Set personSet = transferElements(personList,()-> new HashSet<>());

//使用方法引用

//引用的是构造方法

Set personSet2 = transferElements(personList, HashSet:: new );


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java求字符串中出现次数最多的字符串以及出现次数
下一篇:Spring Task定时任务的配置和使用详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~