Java方法引用是一种简洁的语法,允许开发者直接引用已存在的方法,而无需编写额外的Lambda表达式这种特性在Java 8中被引入,作为Lambda表达式的补充,使得代码更加紧凑和易读。

一、Java方法引用的基本概念

  • 定义:方法引用是一种直接引用已经存在的方法的方式,它允许在代码中通过方法的名称来引用方法,可以被看作是Lambda表达式的一种简化形式。
  • 示例
  • java

    import java.util.Arrays;

    public class Main {

    public static void main(String[] args) {

    String[] array = new String[]{"Apple", "Orange", "Banana", "Lemon"};

    Arrays.sort(array, Main::cmp);

    System.out.println(String.join(", ", array));

    static int cmp(String s1, String s2) {

    return pareTo(s2);

    在上述代码中,`Arrays.sort(array, Main::cmp);`直接传入了静态方法`cmp`的引用,用`Main::cmp`表示。因为`Comparator`接口定义的方法`int compare(String, String)`和静态方法`int cmp(String, String)`相比,除了方法名外,方法参数一致,返回类型相同,所以可以直接把方法名作为Lambda表达式传入。

    二、Java方法引用的分类

    Java方法引用:简化代码的神奇武器

    Java中的方法引用有四种类型,每种类型的使用方式有所不同:

    | 类型 | 语法 | 示例 |

    |-|-|-|

    | 静态方法引用 | `Class::static_method` | `cars.forEach(Car::collide);` |

    | 特定对象的方法引用 | `instance::method` | `final Car police = Car.create(Car::new); cars.forEach(police::follow);` |

    | 特定类的任意对象的方法引用 | `Class::method` | `cars.forEach(Car::repair);` |

    | 构造方法引用 | `Class::new` | `final Car car = Car.create(Car::new); final List cars = Arrays.asList(car);` |

    三、Java方法引用的使用场景

  • 使用场景:当要传递给Lambda体的操作,已经有实现的方法了,就可以使用方法引用。
  • 示例
  • java

    import java.util.function.Consumer;

    public class MethodReferencesDemo1 {

    public static void main(String[] args) {

    Consumer consumer = System.out::println;

    consumer.accept("只消费,不返回");

    这里`System.out.println(s)`这个表达式被替换成了`System.out::println`,因为`System.out.println(s)`这个操作已经有现成的方法实现,所以可以使用方法引用。

    四、Java方法引用与Lambda表达式的区别

    Java方法引用:简化代码的神奇武器

    | 特性 | Lambda表达式 | 方法引用 |

    |-|-|-|

    | 使用场景 | 通常用于匿名函数的定义和传递 | 通常用于重用已有的方法 |

    | 方法调用时机 | 作为参数传递给另一个方法时,会在运行时动态地创建一个实现函数式接口的匿名对象,并执行其中的方法 | 在编译时就确定了要调用的方法 |

    | 代码简洁性 | 相对较长,尤其是当只是调用一个已存在的方法时 | 更简洁,是一种更紧凑、易读的Lambda表达式 |

    | 示例 | `Comparator comparator1 = (t1, t2) -> pare(t1, t2);` | `Comparator comparator2 = Integer::compare;` |