方法引用
方法引用是Java8中提出的用来简化Lambda表达式的一种手段,它通过类名和方法名来定位一个静态方法或者实例方法。方法引用使用"::"定义,"::"的前半部分表示类名或者实例名,后半部分表示方法名称,如果是构造器函数,则使用new表示。
1、静态方法引用:ClassName::methodName
- List<String> 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 extends User> {
- T create(String username);
- }
- public static void main(String[] args) {
- Test t = new Test();
- t.test();
- }
- private void test() {
- UserFactory<User> uf = User::new;
- List<User> 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类的实例方法。
输出结果: