方法引用
方法引用是 Java 8 引入的一个语法糖,它允许你直接引用已有方法或构造函数,而无需编写冗余的 Lambda 表达式。
基本语法
如果 Lambda 表达式的内容仅仅是调用一个已存在的方法,那么就可以用方法引用来替换。使用方法引用最直观的感受就是不用再去写冗余的形参了。
java
类名或对象::方法名当函数式接口的抽象方法参数 & 返回值和某个类的方法参数&返回值相同,我们就可以使用方法引用
方法引用不是在“执行”方法,而是在**“描述”一个逻辑传递**。它本质上是把参数的传递交给了底层的函数式接口去自动处理。
静态方法引用
- Lambda表达式:
java
Function<String, Integer> f = (s) -> Integer.parseInt(s);- 方法引用:
java
Function<String, Integer> f = Integer::parseInt;对象实例方法引用
引用一个已经存在的外部对象的方法。
- Lambda表达式:
java
list.forEach(item -> System.out.println(item));- 方法引用:
java
list.forEach(System.out::println);特定类型的实例方法引用
这种形式比较特殊:Lambda 的第一个参数变成方法的调用者,其余参数变成方法的参数。从视觉上看会觉得是在调用类的静态方法
示例1:判断相等
- Lambda表达式:
java
BiPredicate<String, String> bp = (x, y) -> x.equals(y);- 方法引用:
java
BiPredicate<String, String> bp = String::equals;示例2:小写转大写
- Lambda表达式:
java
List<String> list = Arrays.asList("apple", "vue", "java");
// Lambda 形式:显式接收参数 s,并调用 s.toUpperCase()
list.stream()
.map(s -> s.toUpperCase())
.forEach(System.out::println);- 方法引用
java
// 方法引用形式:类名::实例方法名
list.stream()
.map(String::toUpperCase)
.forEach(System.out::println);构造方法引用
用于创建对象。具体调用哪个构造器,取决于函数式接口的形参定义
- Lambda表达式:
java
Function<String, User> function = (s) -> new User(s);- 等价于:
java
Function<String, User> function = User::new;