Java 方法引用 构造器引用 数组引用

一、方法引用

若Lambda体中的内容有方法已经实现了,可以使用“方法引用”(可以理解为方法引用是Lambda表达式的另外一种表现形式)代替Lambda表达式。
方法引用使用一对冒号::,通过方法的名字来指向一个方法。
方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
以前的Lambda表达式的实现写法

  1. Consumer consumer = (x) -> System.out.println(x);

可以看出Lambda体中的内容已经由println()方法做了实现,那么可以直接引用该方法,而不用再写他的实现进行调用

  1. Consumer<String> consumer = (x) -> System.out.println(x);
  2. consumer.accept("一般的Lambda实现");
  3. Consumer<String> stringConsumer = System.out::println;
  4. stringConsumer.accept("使用同类型的方法进行引用实现");

:::danger 注意:引用的方法必须和函数式接口的参数返回值保持一致性 ::: image.png

语法格式

①对象实例方法引用-对象::实例方法名

  1. // 对象::实例方法名
  2. @Test
  3. public void methodTest() {
  4. Consumer<String> consumer = (x) -> System.out.println(x);
  5. consumer.accept("一般的Lambda实现");
  6. Consumer<String> stringConsumer = System.out::println;
  7. stringConsumer.accept("使用同类型的方法进行引用实现");
  8. // getName()是employee对象的实例方法
  9. Employee employee = new Employee("Fcant", 16, 1600);
  10. Supplier<String> stringSupplier = employee::getName;
  11. System.out.println(stringSupplier.get());
  12. }

②静态方法引用-类::静态方法名

  1. // 类::静态方法名
  2. @Test
  3. public void methodStaticTest() {
  4. Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);
  5. Comparator<Integer> integerComparator = Integer::compare;
  6. }

image.png

③类实例方法引用-类::实例方法名

若Lambda参数列表中的第一参数是实例方法的调用者,而第二个参数是实例方法的参数时,可以使用类名::方法名

  1. // 类::实例方法名
  2. @Test
  3. public void Test() {
  4. BiPredicate<String, String> biPredicate = (x, y) -> x.equals(y);
  5. // 实例方法的第一个参数作为调用者,第二个参数作为调用者的参数,就可以使用类::实例方法名进行调用
  6. BiPredicate<String, String> stringBiPredicate = String::equals;
  7. }

二、构造器引用

语法格式:ClassName::new;

需要调用的构造器的参数列表与函数式接口中抽象方法的参数列表保持一致。

  1. // 构造器引用
  2. @Test
  3. public void constructTest() {
  4. Supplier<Employee> supplier = () -> new Employee();
  5. Supplier<Employee> employeeSupplier = Employee::new;
  6. System.out.println(employeeSupplier.get());
  7. Function<String, Employee> function = (x) -> new Employee(x);
  8. Function<String, Employee> employeeStringFunction = Employee::new;
  9. System.out.println(employeeStringFunction.apply("Fcant"));
  10. }

Employee.java添加新的构造器

  1. public Employee(String name) {
  2. this.name = name;
  3. }

三、数组引用

语法格式:Type[]::new

  1. // 数组引用
  2. @Test
  3. public void typeTest() {
  4. Function<Integer, String[]> function = (x) -> new String[x];
  5. String[] strings = function.apply(10);
  6. System.out.println(strings.length);
  7. Function<Integer, String[]> integerFunction = String[]::new;
  8. String[] s = integerFunction.apply(20);
  9. System.out.println(s.length);
  10. }