javaSE_8系列博客——Java语言的特性(三)--类和对象(20)--嵌套类(Lambda 表达式--VS--方法引用)
来源:互联网 发布:java获取文件路径 编辑:程序博客网 时间:2024/06/06 04:40
回顾上节的Lambda表达式的内容:
您已经学会了使用lambda表达式创建匿名方法。然而,有时,lambda表达式只是调用现有方法。在这些情况下,通过名称引用现有方法往往更加清楚。方法引用使您能够做到这一点 ; 对于已经有名称的方法,它们是紧凑的,易于阅读的lambda表达式。
再次考虑Lambda表达式中讨论的Person类:
public class Person { public enum Sex { MALE, FEMALE } String name; LocalDate birthday; Sex gender; String emailAddress; public int getAge() { // ... } public Calendar getBirthday() { return birthday; } public static int compareByAge(Person a, Person b) { return a.birthday.compareTo(b.birthday); }}
假设您的社交网络应用程序的成员包含在数组中,并且您想按年龄排序数组。您可以使用以下代码片段:
Person[] rosterAsArray = roster.toArray(new Person[roster.size()]);class PersonAgeComparator implements Comparator<Person> { public int compare(Person a, Person b) { return a.getBirthday().compareTo(b.getBirthday()); }}Arrays.sort(rosterAsArray, new PersonAgeComparator());
此调用sort的方法签名如下:
static <T> void sort(T[] a, Comparator<? super T> c)
请注意,Comparator接口是一个函数接口。因此,您可以使用lambda表达式,而不是定义一个类,然后创建实现Comparator的类的新实例:
Arrays.sort(rosterAsArray, (Person a, Person b) -> { return a.getBirthday().compareTo(b.getBirthday()); });
然而,这种比较两个Person实例的出生日期的方法已经存在为Person.compareByAge。您可以在lambda表达式的正文中调用此方法:
Arrays.sort(rosterAsArray, (a, b) -> Person.compareByAge(a, b));
因为这个lambda表达式调用一个现有的方法,所以可以使用方法引用而不是lambda表达式:
Arrays.sort(rosterAsArray, Person::compareByAge);
引用Person :: compareByAge的方法在语义上与lambda表达式(a,b) - > Person.compareByAge(a,b)相同。每个都有以下特点:
- 其形式参数列表从Comparator .compare复制,它是(Person,Person)
- 它的代码中调用Person.compareByAge方法。
常见的方法引用
引用静态方法
引用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 myComparisonProvider = new ComparisonProvider();Arrays.sort(rosterAsArray, myComparisonProvider::compareByName);
引用myComparisonProvider :: compareByName的方法调用作为对象myComparisonProvider的一部分的compareByName方法。 JRE推断方法类型参数,在这种情况下是(Person,Person)。
引用特定类型的任意对象的实例方法
String[] stringArray = { "Barbara", "James", "Mary", "John", "Patricia", "Robert", "Michael", "Linda" };Arrays.sort(stringArray, String::compareToIgnoreCase);
引用String :: compareToIgnoreCase的方法的等效lambda表达式将具有形式参数列表(String a,String b),其中a和b是用于更好地描述此示例的任意名称。方法引用将调用方a.compareToIgnoreCase(b)。
引用一个构造函数
public static <T, SOURCE extends Collection<T>, DEST extends Collection<T>> DEST transferElements( SOURCE sourceCollection, Supplier<DEST> collectionFactory) { DEST result = collectionFactory.get(); for (T t : sourceCollection) { result.add(t); } return result;}
Supplier 的函数接口包含一个方法,它不需要参数并返回一个对象。因此,您可以使用lambda表达式调用方法transferElements,如下所示:
Set<Person> rosterSetLambda = transferElements(roster, () -> { return new HashSet<>(); });
您可以使用构造函数引用代替lambda表达式,如下所示:
Set<Person> rosterSet = transferElements(roster, HashSet::new);
Java编译器推测您要创建一个包含Person类型的元素的HashSet集合。或者,您可以指定如下:
Set<Person> rosterSet = transferElements(roster, HashSet<Person>::new);
- javaSE_8系列博客——Java语言的特性(三)--类和对象(20)--嵌套类(Lambda 表达式--VS--方法引用)
- javaSE_8系列博客——Java语言的特性(三)--类和对象(19)--嵌套类(Lambda 表达式)
- javaSE_8系列博客——Java语言的特性(三)--类和对象(21)--何时使用Lambda 表达式?
- javaSE_8系列博客——Java语言的特性(三)--类和对象(15)--嵌套类
- javaSE_8系列博客——Java语言的特性(三)--类和对象(5)--定义方法
- javaSE_8系列博客——Java语言的特性(三)--类和对象(11)--从方法返回值
- javaSE_8系列博客——Java语言的特性(三)--类和对象(16)--嵌套类(内部类的示例)
- javaSE_8系列博客——Java语言的特性(三)--类和对象(17)--嵌套类(本地/局部类)
- javaSE_8系列博客——Java语言的特性(三)--类和对象(18)--嵌套类(匿名类)
- javaSE_8系列博客——Java语言的特性(三)--类和对象(9)--对象的创建
- javaSE_8系列博客——Java语言的特性(三)--类和对象(10)--对象的使用
- javaSE_8系列博客——Java语言的特性(三)--类和对象(8)--对象
- javaSE_8系列博客——Java语言的特性(三)--类和对象(3)--类的声明
- javaSE_8系列博客——Java语言的特性(三)--类和对象(13)--理解类的成员
- javaSE_8系列博客——Java语言的特性(三)--类和对象(2)--类(宏观概述)
- javaSE_8系列博客——Java语言的特性(三)--类和对象(1)--概述
- javaSE_8系列博客——Java语言的特性(三)--类和对象(4)--声明成员变量
- javaSE_8系列博客——Java语言的特性(三)--类和对象(12)--使用this关键字
- 伪静态如何实现的
- java面试题int a=2*8怎样运算效率最快?
- 归并排序
- Artdialog使用总结
- tf.nn.rnn_cell.MultiRNNCell函数用法
- javaSE_8系列博客——Java语言的特性(三)--类和对象(20)--嵌套类(Lambda 表达式--VS--方法引用)
- jQuery HTML之捕获、设置、元素添加、元素删除
- Python3.X 爬虫实战(缓存与持久化)
- 苹果开发者计划许可协议(2017年5月2日)
- Python3.X 爬虫实战(并发爬取)
- 详解生成器、迭代器
- 【求树的重心】POJ
- 文章标题
- 阿里云ECS搭建JAVA WEB环境