这篇文章主要讲解了“Java8新特性之方法引用的使用方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java8新特性之方法引用的使用方法”吧!
一前言
日常开发中,经常使用到λ表达式,例如:
public static void main (String [], args), { ,Listlist =, arrays . aslist(1, 5日,10日,4日,2); ,//打印列表中的每一个数字 ,list.forEach ((x),→, System.out.println (x)); }
其中(x)→System.out.println (x)就是使用的λ表达式.Lambda表达式可以分为三部分:
- <李>
左括号:λ的形参列表,对应接口的抽象方法的形参列表。
李> <李>箭头:λ的操作符,可以理解为参数列表和λ体的分隔符。
李> <李>λ体:即对应接口中的抽象方法的实现方法体。
你是否发现,上述例子的λ表达式的λ体仅仅调用一个已存在的方法,而不做任何其它事。对于这种情况,通过一个方法名字来引用这个已存在的方法会更加清晰。所以,方法引用应运而生,方法引用是一个更加紧凑,易读的λ表达式,它是λ表达式的另外一种表现形式,方法引用的操作符是双冒号::。
使用了方法引用,上述例子编写如下,变得更加紧凑,易读了。
public static void main (String [], args), { ,Listlist =, arrays . aslist(1, 5日,10日,4日,2); ,//打印列表中的每一个数字 ,list.forEach (system . out:: println); }
二方法引用
方法引用就是通过方法的名字来指向一个方法。它可以使语言的构造更紧凑简洁,减少冗余代码。方法引用的操作符是双冒号::。方法引用有如下几种分类:
类型语法λ表达式静态方法引用类名::静态方法名(args)→类名。静态方法名(args)实例方法引用实例::实例方法名(args)→实例。实例方法名(args)对象方法引用类名::对象方法名(本月,args)→类名。对象方法名(args)构建方法引用类名::新(args)→新类名(args)三实践
以下例子主要借用学生类来演示,学生类定义如下:
public class Student { ,private String 名称; ,private Integer 年龄; ,public static  int compareByAge (Student , s1, Student s2), { return 才能s1.age.compareTo (s2.age); ,} ,//省略属性获?设置方法 }
<强> 3.1静态方法引用强>
现假设有50个学生,存放在一列个清单表中,现需要对年龄进行从小到大排序。我们一般会写一个比较器进行排序,如下:
package com.nobody; import java.util.ArrayList; import java.util.Comparator; import 并不知道;/* * ,* @Description ,* @Author Mr.nobody ,* @Date 2021/3/7 ,* @Version 1.0 ,*/public class  Test { ,public static  void main (String [], args), { List<才能;Student>, list =, new ArrayList<在();//,才能添加元素省略,测试可自行添加//,才能排序 list . sort (new StudentAgeComparator就,,()); ,} ,//对学生年龄的比较器 ,static class  StudentAgeComparator implements  Comparator, { public 才能;int 比较(Student s1, Student s2), { ,,return s1.getAge () .compareTo (s2.getAge ()); ,,} ,} }
我们发现,列表的排序方法接受的参数比较器是一个函数式接口,则可以用λ表达式改为如下形式:
list.sort ((s1, s2),→, s1.getAge () .compareTo (s2.getAge ())),
我们又发现,学生类有个静态方法compareByAge,其功能和上述λ表达式一样,所以我们可以将以上λ表达式改为如下形式:
list.sort ((s1, s2),→, Student.compareByAge (s1, s2));
可以看的出,最终的λ表达式是调用学生类的一个方法,所以,根据静态方法引用规则,可改为如下形式:
list.sort(学生::compareByAge);
<强> 3.2实例方法引用强>
即引用已经存在的实例的方法。静态方法引用类无需实例化,直接用类名来调用,而实例方法引用是要先实例化对象。
如果将学生类的静态方法compareByAge改为非静态方法,即:
public int compareByAge (Student , s1, Student s2), { ,return s1.age.compareTo (s2.age); }Java8新特性之方法引用的使用方法