9159金沙游艺场-奥门金沙游艺场-[欢迎您]

9159金沙游艺场为您呈现最新的面貌!,目前注册送体验金,欢迎您将成为影视娱乐行业新的风向标,是亚洲的优质娱乐先锋。

方法引用

日期:2019-10-07编辑作者:服务器

Java学习笔记-方法引用,java学习笔记引用

方法引用(Method Reference)

上一篇中记录了Lambda表达式,其可以创建匿名方法。当Lambda表达式只是调用一个存在的方法时,可以采用方法引用(JDK8具有的特性)。如下:

 1 public class Person {
 2 
 3     public enum Sex {
 4         MALE, FEMALE
 5     }
 6 
 7     String name;
 8     LocalDate birthday;
 9     Sex gender;
10     String emailAddress;
11     int age;
12 
13     public int getAge() {
14         return age;
15     }
16     
17     public LocalDate getBirthday() {
18         return birthday;
19     }    
20 
21     public static int compareByAge(Person a, Person b) {
22         return a.birthday.compareTo(b.birthday);
23     }
24 } 

假设需要对一组人员按年龄进行排序,可以采用下边的方式,将人员数组与实现的比较器,传递给Array.sort方法:

1 Person[] rosterAsArray = roster.toArray(new Person[roster.size()]);
2 
3 class PersonAgeComparator implements Comparator<Person> {
4     public int compare(Person a, Person b) {
5         return a.getBirthday().compareTo(b.getBirthday());
6     }
7 }
8         
9 Arrays.sort(rosterAsArray, new PersonAgeComparator()); 

当然,可以将PersonAgeComparator的实现采用Lambda表达式,如下:

1  Arrays.sort(rosterAsArray, (a,b) -> a.birthday.compareTo(b.birthday)); 

Person类中已经包含根据年龄的比较compareByAge,只需要在Lambda表达式体中直接调用即可

1 Arrays.sort( rosterAsArray, (a,b) -> Person.compareByAge(a,b)); 

由于Lambda表达式调用一个已经存在的方法,可以使用方法引用代替Lambda表达式,如下:

1 Arrays.sort(rosterAsArray, Person::compareByAge); 

其中 ,Person::compareByAge 与 (a, b) -> Person.compareByAge(a, b)是等价的。(1)其参数拷贝于Comparator<Person>.compare,即 (Person, Person);(2)body将调用Person.compareByAge。

方法引用类别

有4种方法引用,如下:

  • 引用静态方法,如 ContainingClass::staticMethodName;
  • 引用实例方法,如 containingObject::instanceMethodName;
  • 引用特殊类型对象的方法,如 ContainingType::methodName;
  • 引用构造函数,如 ClassName::new。

(1)引用静态方法

上文中的例子即为静态方法引用。

9159金沙游艺场 ,(2)引用实例方法

即通过类的实例引用方法,如下:

 1 class ComparisonProvider {
 2     public int compareByName(Person a, Person b) {
 3         return a.getName().compareTo(b.getName());
 4     }
 5         
 6     public int compareByAge(Person a, Person b) {
 7         return a.getBirthday().compareTo(b.getBirthday());
 8     }
 9 }
10 ComparisonProvider myComparisonProvider = new ComparisonProvider();
11 Arrays.sort(rosterAsArray, myComparisonProvider::compareByName); 

(3)引用特殊类型对象的方法

以String为例:

1 String[] stringArray = { "Barbara", "James", "Mary", "John",
2     "Patricia", "Robert", "Michael", "Linda" };
3 Arrays.sort(stringArray, String::compareToIgnoreCase); 

(4)引用构造函数

假设transferElements实现从一个集合到另一个集合拷贝元素,如下:

 1 public static <T, SOURCE extends Collection<T>, DEST extends Collection<T>>
 2     DEST transferElements(
 3         SOURCE sourceCollection,
 4         Supplier<DEST> collectionFactory) {
 5         
 6         DEST result = collectionFactory.get();
 7         for (T t : sourceCollection) {
 8             result.add(t);
 9         }
10         return result;
11 } 

其中Supplier包含一个get方法,只返回一个空的集合对象,并且不需要任何参数,可以使用Lambda表达式实现,如下:

1 Set<Person> rosterSetLambda =
2     transferElements(roster, () -> { return new HashSet<>(); }); 

此时可以采用引用构造函数的方法,如下:

Set<Person> rosterSet = transferElements(roster, HashSet::new);
//或
Set<Person> rosterSet = transferElements(roster, HashSet<Person>::new); 

总结

  • 对于Lambda表达式,当只是调用一个已存在的方法时,可以采用方法引用的方式实现,编译器会自行翻译

参考

       Method references

 

方法引用(Method Reference) 上一篇中记录了Lambda表达式,其可以创建匿名方法。 当Lambda表达式只是...

本文由9159金沙游艺场-奥门金沙游艺场-[欢迎您]发布于服务器,转载请注明出处:方法引用

关键词:

图解RAID 0, RAID 1, RAID 5, RAID 10

RAID(Redundant Array of Independent Disk独立冗余磁盘阵列)技术是加州大学伯克利分校1987年提出,最初是为了组合小的廉价磁...

详细>>

虚拟机通过NAT模式访问外网

Linux 虚构机通过NAT格局访谈外网 1、配置当地VM8地址 2、配置设想机NAT网卡:设置VM8网卡地址和Linux主机一样网段地址...

详细>>

U盘安装CentOS7全程笔记

终于将CentOS7装上台式机了,进程极端艰难,因为自个儿开掘英特网海南大学学家关系的装有U盘安装CentOS7时遇见的难...

详细>>

Ubuntu 16.04下安装Matlab

Matlab与C/C++联合编程之从Matlab调用C/C++代码http://www.linuxidc.com/Linux/2012-08/68148.htm Matlab编译cuda的.cu文件http://www.linuxidc....

详细>>