方法引用使得开发者可以直接引用现存的方法、Java类的构造方法或者实例对象。方法引用和Lambda表达式配合使用,使得java类的构造方法看起来紧凑而简洁,没有很多复杂的模板代码。方法引用时对Lambda表达式符合特定情况下的一种缩写方式,它使得Lambda表达式更加精简,可以理解为Lambda表达式的缩写,不过只能引用已经存在的方法。方法引用一般存在下面介绍的五种。

实例对象 :: 方法名

  1. public static void main(String[] args) {
  2. Date date = new Date();
  3. //普通的Lambda表达式
  4. Supplier<Long> supplier1 = () -> {
  5. return date.getTime();
  6. };
  7. System.out.println(supplier1.get());
  8. //使用方法引用的Lambda表达式
  9. Supplier<Long> supplier2 = date::getTime;
  10. System.out.println(supplier2.get());
  11. }

image.png

类名 :: 静态方法名

  1. public static void main(String[] args) {
  2. //普通的Lambda表达式
  3. Supplier<Long> supplier1 = () -> {
  4. //currentTimeMillis为静态方法
  5. return System.currentTimeMillis();
  6. };
  7. System.out.println(supplier1.get());
  8. //使用方法引用的Lambda表达式
  9. Supplier<Long> supplier2 = System::currentTimeMillis;
  10. System.out.println(supplier2.get());
  11. }

image.png

类名 :: 引用实例方法

在Java的面向对象中,类名只能调用静态方法,类名引用实例方法是有前提的,实际上是用第一个参数作为方法的调用者。如:

  1. public static void main(String[] args) {
  2. //普通的Lambda表达式
  3. Function<String, Integer> function1 = (s) -> {
  4. return s.length();
  5. };
  6. System.out.println(function1.apply("Hello World"));
  7. //使用方法引用的Lambda表达式
  8. Function<String, Integer> function2 = String::length;
  9. System.out.println(function2.apply("are you ok? 666"));
  10. }

image.png

类名 :: new

这是调用了类的构造器,如:

  1. public static void main(String[] args) {
  2. //普通的Lambda表达式
  3. Supplier<Person> supplier1 = () -> {
  4. return new Person();
  5. };
  6. System.out.println(supplier1.get());
  7. //使用方法引用的Lambda表达式
  8. Supplier<Person> supplier2 = Person::new;
  9. System.out.println(supplier2.get());
  10. }

image.png
如果同时要给Person,可以使用其它更多参数的函数式接口。

数组 :: new

  1. public static void main(String[] args) {
  2. //普通的Lambda表达式
  3. Function<Integer, String[]> function1 = (len) -> {
  4. return new String[len];
  5. };
  6. System.out.println(function1.apply(3));
  7. //使用方法引用的Lambda表达式
  8. Function<Integer, String[]> function2 = String[]::new;
  9. System.out.println(function2.apply(4));
  10. }

image.png