public class Person {
private String name;
Person() {
}
Person(String name) {
this.name = name;
}
static String say(String something) {
return something;
}
String sing(String songName) {
return songName;
}
void dance(String str){
System.out.println(str);
}
}
定义一个Person类,有构造方法,静态方法say和非静态方法sing、dance
- 使用 :: 引用 构造方法
import java.util.function.Function;
public class Test {
public static void main(String[] args) {
//访问构造方法
Function<String, Person> function = Person::new;
Person person = function.apply("张医生");
}
}
- 使用 :: 引用静态方法
import java.util.function.Function;
public class Test {
public static void main(String[] args) {
//访问静态方法
Function<String, String> function = Person::say;
String say = function.apply("helle");
System.out.println("say:" + say);
}
}
- 使用 :: 引用非静态方法
import java.util.function.Function;
public class Test {
public static void main(String[] args) {
//访问非静态方法
Person person1 = new Person();
Function<String, String> sing = person1::sing;
String songName = sing.apply("月亮之上");
System.out.println("songName:" + songName);
}
}
可以看到 :: 引用都会返回java.util.function.Function对象,这是jdk提供的 functional interface,Function<T,R>对象只有一个抽象方法 R apply(T var1); 传参为类型 T,返回类型 R。
因此我们访问person类的方法时,jdk能够根据Function接口定义的"模板"匹配到相应的方法。
这里的Function也可以通过自定义实现。只要满足functional interface即可。
出了上面三种使用方式外,:: 还可以引用超类方法,和数组构造器
- 使用 :: 引用超类方法
public class Doctor extends Person {
Doctor() {
}
void dance() {
List<String> list = Arrays.asList("1234", "2234", "3234");
list.forEach(super::dance);
}
}
public class Test {
public static void main(String[] args) {
Doctor d = new Doctor();
d.dance();
}
}
- 使用 :: 引用数据构造器
public class Test { public static void main(String[] args) { //访问数组构造器 Function<Integer,Person[]> function = Person[]::new; Person[] personArray = function.apply(4); for (Person person : personArray) { System.out.println(person);//输出4个空对象 } } }