方法和构造器的引用
上个教程中的例子可以通过使用静态方法的引用来进一步简化:
1
2
3
  |  Converter<String, Integer> converter = Integer::valueOf;
  Integer converted = converter.convert("123");
  System.out.println(converted);   // 123
  | 
 
Java 8 中可以使用::关键字来传递对方法或构造器的引用。上面的例子展示了如何引用一个静态方法。同样我们也可以引用对象中的方法:
1
2
3
4
5
6
7
8
9
  |  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"
  | 
 
下面来看如何使用::关键字来引用构造器。首先我们定义了一个拥有多个不同构造器的bean。
1
2
3
4
5
6
7
8
9
10
11
  |  class Person {
      String firstName;
      String lastName;
  
      Person() {}
  
      Person(String firstName, String lastName) {
          this.firstName = firstName;
          this.lastName = lastName;
      }
  }
  | 
 
接下来定义一个person类的工厂接口来创建person实例。
1
2
3
  |  interface PersonFactory<P extends Person> {
      P create(String firstName, String lastName);
  }
  | 
 
通过使用构造器的引用我们就可以避免手动去实现上面的工厂接口,代码简洁了很多。
1
2
  |  PersonFactory<Person> personFactory = Person::new;
  Person person = personFactory.create("Peter", "Parker");
  | 
 
我们使用Person::new创建了一个对Person类的构造器的引用。Java编译器会通过匹配PersonFactory.create方法的签名自动选用合适的构造器。