Java8新特性-方法引用、构造器引用、数组引用

148 阅读4分钟

方法引用

方法引用承接自Lambda表达式,若Lambda表达式中的内容已经有方法实现了,那么就可以使用方法引用,Lambda表达式中只有一个方法的时候就可以使用方法引用。

下面介绍方法引用的三种格式

  • 对象::实例方法名

注意:Lambda体中的方法的参数列表和返回值要与所实现函数式接口的参数列表和返回值保持一致
@Test
  public void Test1() {
      //举例1
      Consumer<String> con = (x) -> System.out.println(x);//使用Lambda表达式
      con.accept("Hello");
      Consumer<String> con1 = System.out::println;        //使用方法引用
      con1.accept("World");
      //举例2
      Student student = new Student("Moti",10,"男");
      Supplier<String> stuName = () -> student.getName();    //使用Lambda表达式
      System.out.println(stuName.get());
      Supplier<String> stuName1 = student::getName;        //使用方法引用
      System.out.println(stuName1.get());
  }

输出结果如下:

img
img

可见使用Lambda表达式的写法和使用方法引用的写法的效果是一样的!使用方法引用会更加简化代码

  • 类名::静态方法名

注意:Lambda体中的方法的参数列表和返回值要与所实现函数式接口的参数列表和返回值保持一致
@Test
  public void Test2() {
      Comparator<Integer> com = (x,y) -> Integer.compare(x, y);//使用Lambda表达式
      Comparator<Integer> com1 = Integer::compare;             //使用方法引用
  }

两者的使用效果同样也是一样的.

  • 类名::实例方法名

注意:Lambda体中的方法的参数列表和返回值要与所实现函数式接口的参数列表和返回值保持一致
第一个参数是lambda体中方法的调用者,第二个参数是方法的参数时,可以使用 类名::实例方法名的方法引用
  @Test
  public void Test3() {
      BiPredicate<StringString> bp = (x,y) -> x.equals(y);     //使用Lambda表达式
      BiPredicate<StringString> bp1 = String::equals;         //使用方法引用
  }

两者的使用效果同样也是一样的.

构造器引用

构造器引用算是方法引用的一种特殊情况

格式如下

  • 类名::new

注意: 需要调用的构造器参数列表要与函数式接口中的参数列表保持一致!
  @Test
  public void Test1() {
      Supplier<Student> supplier = () -> new Student();    //使用Lambda表达式
      Supplier<Student> supplier1 = Student::new;            //使用构造器引用
  }

上面的构造器引用对应的是空参构造器 public Student() {}

@Test
  public void Test2() {
      Function<String, Student> function1 = (name) -> new Student(name); //使用Lambda表达式
      Function<String, Student> function2 = Student::new;                   //使用构造器引用
      System.out.println(function1.apply("Moti"));
      System.out.println(function2.apply("Moti"));
      BiFunction<String, Integer, Student> function3 = (name,age) -> new Student(name, age);//使用Lambda表达式
      BiFunction<String, Integer, Student> function4 = Student::new;                          //使用构造器引用    
      System.out.println(function3.apply("Moti",20));
      System.out.println(function4.apply("Moti",20));    
  }

以上方法中function1和function2对应的构造器是

 public Student(String name) {
  this.name = name;
 } 

而function3和function4对应的构造器是

public Student(String name, int age) {
   this.name = name;
   this.age = age;
} 

数组引用

格式如下

  • type(数组类型)::new

@Test
  public void Test() {
      Function<Integer, String[]> fun1 = (x) ->new String[x];        //使用Lambda表达式
      System.out.println(fun1.apply(10).length);                    
      Function<Integer, String[]> fun2 = String[]::new;            //使用数组引用
      System.out.println(fun2.apply(20).length);
  }