Java里面的方法引用
方法引用
-
引用处必须是函数式接口
-
:: 方法引用符
-
被引用的地方必须已经存在
-
被引用方法的形参和返回值需要和抽象方法保持一致
-
被引用方法的功能要满足当前需求
-
引用静态方法
- 类名::静态方法
-
引用成员方法
-
对象::成员方法
-
this::成员方法
-
super::成员方法
-
-
引用构造方法
- 类名::new
-
使用类名引用成员方法
-
不能引用所有类中的成员方法
-
如果抽象方法的第一个参数类型是A类型的,只能引用A类中的方法
-
-
引用数组的构造方法
-
数据类型[]::new
-
例子:int[]::new
什么是方法引用
-
把已经存在的方法拿过来用,当做函数式接口中抽象方法的方法体
在Java中,方法引用(Method References)是Java 8引入的一个新特性,它允许你直接引用现有Java类或对象的方法或构造器。这可以被视为Lambda表达式的一种简化表示法,在不需要传递任何参数,或者只需要从某个对象的实例调用方法时特别有用。
方法引用的作用
方法引用主要用于简化Lambda表达式的编写,使得代码更加简洁和易于理解。在很多情况下,方法引用可以提供一种比Lambda表达式更加清晰、直观的表达方式。
方法引用的分类和使用
方法引用主要分为四类:
- 静态方法引用:通过类名直接引用静态方法。
List<String> list = Arrays.asList("a", "b", "A", "B");
list.sort(String::compareToIgnoreCase);
- 特定对象的实例方法引用:通过对象实例引用实例方法。
String str = "Hello";
Predicate<String> startsWithHello = str::startsWith;
boolean result = startsWithHello.test("Hello World"); // true
注意,在这个例子中,startsWithHello
引用的是str
这个特定对象的startsWith
方法,而不是String
类的静态方法。
3. 特定类型的任意对象的实例方法引用:通过类名引用实例方法,但方法的第一个参数是实例本身的类型(即隐式参数this
)。
List<String> list = Arrays.asList("apple", "banana", "cherry");
list.forEach(String::toUpperCase); // 打印每个字符串的大写形式
在这个例子中,String::toUpperCase
引用了String
类的toUpperCase
方法,并且Lambda表达式中的参数(即列表中的每个字符串)会自动作为该方法的第一个参数(即隐式参数this
)。
4. 构造器引用:通过类名引用构造器。
Supplier<String> stringSupplier = String::new;
String s = stringSupplier.get(); // 创建一个新的空字符串Function<Integer, String> stringFunction = String::new;
String anotherS = stringFunction.apply(10); // 创建一个新的字符串,内容为"10"(但实际上这不会工作,因为String的构造器不接受int参数)
注意,在构造器引用的例子中,如果构造器接受参数,那么你需要使用合适的函数式接口来匹配这些参数。在上面的例子中,由于String
类的构造器不接受Integer
类型的参数,所以stringFunction.apply(10)
实际上会编译失败。
方法引用是Java 8中Lambda表达式的一个重要组成部分,它允许你以更加简洁和直观的方式表达Lambda表达式的功能。通过方法引用,你可以减少代码的冗余,提高代码的可读性和可维护性。
例子
package com.mohuanan.exercise;import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;public class Demo06 {public static void main(String[] args) {ArrayList<Student> list = new ArrayList<>();//创建Student对象Student s1 = new Student("张三", 23);Student s2 = new Student("李四", 24);Student s3 = new Student("王五", 25);//添加到集合里面Collections.addAll(list, s1, s2, s3);//获取stream流/*String[] array = list.stream().map(new Demo06()::jointString).toArray(String[]::new);System.out.println(Arrays.toString(array));*/String[] array = list.stream().map(s -> s.getName() + s.getAge()).toArray(String[]::new);System.out.println(Arrays.toString(array));}public String jointString(Student stu){return ""+stu.getName()+stu.getAge();}
}