当我们在使用lambda去表示某个函数式接口的实例时,需要在lambda表达式的主体里去编写函数式接口抽象方法的实现,如果在现有的类中已经存在与抽象方法类似的方法了,我们希望直接引用现有的方法,而不用再去重新写实现了。方法引用让你可以重复使用现有的方法定义,并像Lambda一样传递它们。
方法引用和lambda表达式拥有相同的特性,它们都需要代表一个目标类型,并需要被转化为函数式接口的实例,不过我们并不需要为方法引用提供方法体,我们可以直接通过方法名称引用已有方法方。方法引用要使用到操作符“::
”,左边是类名或者对象名,右边是方法名或者关键字new
方法引用分类
首先被引用方法的返回值类型要和函数式接口抽象方法的返回值类型一致,至于参数列表要根据每种引用方式而定。
静态方法引用
- 引用语法:ClassName::staticMethodName
//Function<String, Long> f = x -> Long.valueOf(x);
Function<String, Long> f = Long::valueOf;
Long result = f.apply("10");
静态方法引用时,静态方法要与函数式接口抽象方法参数列表一致
类型的实例方法引用
- 引用语法:ClassName::methodName
//BiPredicate<String, String> bpredicate = (x,y) -> x.equals(y);
BiPredicate<String, String> bpredicate = String::equals;
boolean result = bpredicate.test("abc", "abcd");
//ToIntFunction<String> f = (s) -> s.length();
ToIntFunction<String> f = String::length;
int result2 = f.applyAsInt("hello");
类型的实例方法引用时,函数式接口抽象方法的第一个参数是被引用方法的调用者,第二个参数(或者无参)是被引用方法的参数
外部对象方法引用
- 引用语法:objectName::methodName
List<String> list = Arrays.asList("hello", "world", "aaa");
//Predicate<String> p = (s) -> list.contains(s);
Predicate<String> p = list::contains; //list是lambda的一个外部对象
boolean result = p.test("aaa");
外部对象方法引用时,被引用方法与函数式接口抽象方法参数列表一致
构造器引用
- 引用语法:ClassName::new
//Function<Long, Date> fun = (number) -> new Date(number);
Function<Long, Date> fun = Date::new;
Date date = fun.apply(1000000000000L);
构造器引用时,被引用的构造方法与函数式接口抽象方法参数列表一致
数组引用
- 引用语法:Type[]::new
// Function<Integer, int[]> fun = n -> new int[n];
Function<Integer, int[]> fun = int[]::new;
int[] arr = fun.apply(10);
数组引用时,函数式接口抽象方法参数(数值型)即为数组初始化大小值
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。