方法引用
方法引用是Java8中提出的用来简化Lambda表达式的一种手段,它通过类名和方法名来定位一个静态方法或者实例方法。方法引用使用"::"定义,"::"的前半部分表示类名或者实例名,后半部分表示方法名称,如果是构造器函数,则使用new表示。
1、静态方法引用:ClassName::methodName
List strs = Arrays.asList("aa","bb","cc");
strs.forEach(System.out::println);
输出结果:
2、实例方法引用:instanceRefence::methodName
class Printer {
void print(){
System.out.println("instanceRefence::methodName");
}
private void printInfo(){
//实例方法引用
new Thread(this::print);
}
}
//测试
private void test() {
Printer p = new Printer();
p.print();
}
输出结果:
3、构造方法引用:Class::new
public class Test {
class User {
String username;
User(String username){
this.username = username;
}
public String getUsername(){
return username;
}
}
@FunctionalInterface
interface UserFactory {
T create(String username);
}
public static void main(String[] args) {
Test t = new Test();
t.test();
}
private void test() {
UserFactory uf = User::new;
List users = new ArrayList<>();
for (int i = 0; i < 5; ++i) {
users.add(uf.create("user"+i));
}
users.stream().map(User::getUsername).forEach(System.out::println);
}
}
UserFactory作为User的工厂类,是一个函数式接口。当使用User::new创建接口实例时,系统会根据UserFactory.create()的函数签名选择合适的User构造函数。在创建UsrFactory实例后,对UsrFactory.create()的调用都会委托给User的实际构造函数进行,从而创建User对象实例。User::getUsername表示User类的实例方法。
输出结果:
练习静态方法引用,实例方法引用,构造方法引用