java8方法引用

作者:@JohnTsai
本文为作者原创,转载请注明出处:https://www.cnblogs.com/JohnTsai/p/5806194.html


30分钟入门Java8之方法引用

前言

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

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

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

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

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

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

方法引用的形式

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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);
引用对象的实例方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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);
引用类型对象的实例方法
1
2
3
4
5
6
7
8
String[] stringsArray = { "Hello" , "World" };
 
//使用lambda表达式和类型对象的实例方法
Arrays.sort(stringsArray,(s1,s2)->s1.compareToIgnoreCase(s2));
 
//使用方法引用
//引用的是类型对象的实例方法
Arrays.sort(stringsArray, String::compareToIgnoreCase);
引用构造方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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 );
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值