Java 1.8 快速引用类的构造器及方法
小伙伴们,还记得上一个章节这段示例代码么:
@FunctionalInterface
interface Converter<F, T> {
T convert(F from);
}
Converter<String, Integer> converter = (from) -> Integer.valueOf(from);
Integer converted = converter.convert("123");
System.out.println(converted); // 123
上面这段代码,通过 Java 8 的新特性,进一步简化上面的代码:
Converter<String, Integer> converter = Integer::valueOf;
Integer converted = converter.convert("123");
System.out.println(converted); // 123
Java 8 中允许你通过 ::
关键字来引用类的方法或构造器。上面的代码简单的示例了如何引用静态方法,当然,除了静态方法,我们还可以引用普通方法:
class Something {
String startsWith(String s) {
return String.valueOf(s.charAt(0));
}
}
Something something = new Something();
Converter<String, String> converter = something::startsWith;
String converted = converter.convert("Java");
System.out.println(converted); // "J"
接下来,我们再来看看如何通过 ::
关键字来引用类的构造器。首先,我们先来定义一个示例类,在类中声明两个构造器:
class Person {
String firstName;
String lastName;
Person() {}
Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
然后,我们再定义一个工厂接口,用来生成 Person
类:
// Person 工厂
interface PersonFactory<P extends Person> {
P create(String firstName, String lastName);
}
我们可以通过 ::
关键字来引用 Person
类的构造器,来代替手动去实现这个工厂接口:
// 直接引用 Person 构造器
PersonFactory<Person> personFactory = Person::new;
Person person = personFactory.create("Peter", "Parker");
Person::new
这段代码,能够直接引用 Person
类的构造器。然后 Java 编译器能够根据上下文选中正确的构造器去实现 PersonFactory.create
方法。