
上一篇文章 :(16条消息) 【JDK8 新特性3】常用内置函数式接口_一切总会归于平淡的博客-CSDN博客
目录
在介绍方法引用前,我们要来了解Lambda表达式的冗余场景,虽然Lambda表达式已经帮我们简化的不少代码,但是它还是会有冗余的情况。
我们这里使用Lambda表达式求一个数组的和。该示例可能会很刻意的为了使用方法应用而做。

我们Lambda 表达式里中求和方法是调用getSum,这样做就很冗余啊。
接下来我们就来使用方法应用的方式。
如果我们在Lambda中所指定的功能,已经有其他方法存在相同方案,那是否还有必要再写重复逻辑?可以直接“引用”过去就好了:

请注意其中的双冒号 :: 写法,这被称为“方法引用”,是一种新的语法。
常见引用方式
方法引用在JDK 8中使用方式相当灵活,有以下几种形式:
这是最常见的一种用法,与上面演示的案例相同。如果一个类中已经存在了一个成员方法,则可以通过对象名引用成员方法,代码为
public class Test {
public static void main(String[] args) {
// 实例化时间类
Date date = new Date();
//方法应用
Supplier<Long> getTime = date::getTime;
System.out.println(getTime.get());
}
}这里是为了演示哈,有点刻意了,一般情况下,我们还是可以选择 类.方法名 的方式的。
方法引用的注意事项
由于在 java.lang.System 类中已经存在了静态方法 currentTimeMillis ,所以当我们需要通过Lambda来调用该方法时,可以使用方法引用 , 写法是:
public class Test {
public static void main(String[] args) {
Supplier<Long> supp2 = System::currentTimeMillis;
System.out.println(supp2.get());
}
}Java面向对象中,类名只能调用静态方法,类名引用实例方法是有前提的,实际上是拿第一个参数作为方法的调用者。
public class Test {
public static void main(String[] args) {
BiFunction<String, Integer, String> bif = String::substring;
String hello = bif.apply("hello", 2);
System.out.println("hello = " + hello);
}
}由于构造器的名称与类名完全一样。所以构造器引用使用 类名称::new 的格式表示。
首先是一个简单的 Person 类:
package com.jie.test;
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public Person(String s, Integer integer) {
System.out.println("有参构造方法");
System.out.println("s:" + s + "integer:" + integer);
}
public Person() {
System.out.println("调用无参构造");
}
}应用
public class Test {
public static void main(String[] args) {
Supplier<Person> sup = Person::new;
System.out.println(sup.get());
BiFunction<String, Integer, Person> fun2 = Person::new;
System.out.println(fun2.apply("张三", 18));
}
}数组也是 Object 的子类对象,所以同样具有构造器,只是语法稍有不同。
public class Test {
public static void main(String[] args) {
Function<Integer, int[]> fun = int[]::new;
int[] arr = fun.apply(5);
System.out.println(Arrays.toString(arr));
}
}1、方法引用是对Lambda表达式符合特定情况下的一种缩写,它使得我们的Lambda表达式更加的精简,也可以理解为Lambda表达式的缩写形式 , 不过要注意的是方法引用只能"引用"已经存在的方法。
2、像今天举的案例,很多情况下是不需要Lambda表达式的,所以大家可以根据自己的选择来。