【java8】java新特性(三)——方法引用

一、前言

      之前的文章解释了Java8的Lambda表达式。今天小编继续向大家介绍一下——方法引用。

二、通过lambda表达式引出方法引用

      在我们使用Lambda表达式的时候,我们通常使用lambda表达式来创建匿名方法。如果lambda体中的内容有方法已经实现了,我们可以使用方法引用来简写。

      如,下面这个是一个标准的lambda表达式:

import java.util.List;
import java.util.ArrayList;

public class Java8Tester {
   public static void main(String args[]){
      List names = new ArrayList();

      names.add("Google");
      names.add("Runoob");
      names.add("Taobao");
      names.add("Baidu");
      names.add("Sina");

      names.forEach((x) -> System.out.println(x));
      names.forEach(System.out::println);

   }
}

      可以看出上面两种都可以达到效果,方法引用是lambda的简写,更加的简单。

三、怎么用呢?

      引用方法有下面几种方式

  • 对象引用::实例方法名

  • 类名::静态方法名

  • 类名::实例方法名

对象引用::实例方法名


//Consumer<String> consumer = x -> System.out.println(x);
Consumer<String> consumer = System.out::println;
consumer.accept("This is Major Tom");

      System.out就是一个PrintStream类型的对象引用,而println则是一个实例方法名,需要注意的是没有括号的哟。其中Consumer是Java内置函数式接口,下面的例子用到的都是Java内置函数式接口。Consumer中的唯一抽象方法accept方法参数列表与println方法的参数列表相同,都是接收一个String类型参数。

类名::静态方法名

//Function<Long, Long> f = x -> Math.abs(x);
Function<Long, Long> f = Math::abs;
Long result = f.apply(-3L);

      Math是一个类而abs为该类的静态方法。Function中的唯一抽象方法apply方法参数列表与abs方法的参数列表相同,都是接收一个Long类型参数。

类名::实例方法名

      若Lambda表达式的参数列表的第一个参数,是实例方法的调用者,第二个参数(或无参)是实例方法的参数时,就可以使用这种方法,如

//BiPredicate<String, String> b = (x,y) -> x.equals(y);
BiPredicate<String, String> b = String::equals;
b.test("abc", "abcd");

      String是一个类而equals为该类的定义的实例方法。BiPredicate中的唯一抽象方法test方法参数列表与equals方法的参数列表相同,都是接收两个String类型参数。

引用构造器

      在引用构造器的时候,构造器参数列表要与接口中抽象方法的参数列表一致,格式为 类名::new。如

//Function<Integer, StringBuffer> fun = n -> new StringBuffer(n); 
Function<Integer, StringBuffer> fun = StringBuffer::new;
StringBuffer buffer = fun.apply(10);

      Function接口的apply方法接收一个参数,并且有返回值。在这里接收的参数是Integer类型,与StringBuffer类的一个构造方法StringBuffer(int capacity)对应,而返回值就是StringBuffer类型。上面这段代码的功能就是创建一个Function实例,并把它apply方法实现为创建一个指定初始大小的StringBuffer对象。

引用数组

      引用数组和引用构造器很像,格式为 类型[]::new,其中类型可以为基本类型也可以是类。如


// Function<Integer, int[]> fun = n -> new int[n];
Function<Integer, int[]> fun = int[]::new;
int[] arr = fun.apply(10);

Function<Integer, Integer[]> fun2 = Integer[]::new;
Integer[] arr2 = fun2.apply(10);

四、小结

      方法引用就是Lambda表达式的一种简写,多练吧~

猜你喜欢

转载自blog.csdn.net/kisscatforever/article/details/79723371