阅读springboot源码 记录
关于 :: 双冒号
用stream的map简洁提取id,类似代码1
// 代码1
List<String> Ids = list.stream().map(Student::getId).collect(Collectors.toList())// 代码2
List<String> Ids = list.stream().map(use->{return use.getId();
}).collect(Collectors.toList())
之前以为代码1和代码2是一个意思,今天才意识到原来双冒号返回的是方法引用对象;
让我意识到这个问题的是看了SpringApplication.class源码的时候,有段代码很疑惑。
intitialize函数返回是null,在下面的foreach中,add的时候,都是null吗?
原来::返回的方法引用,并没有执行方法,而是方法作为参数传递下去。
// SpringApplication.class
private List<BootstrapRegistryInitializer> getBootstrapRegistryInitializersFromSpringFactories() {ArrayList<BootstrapRegistryInitializer> initializers = new ArrayList();this.getSpringFactoriesInstances(Bootstrapper.class).stream().map((bootstrapper) -> {return bootstrapper::initialize;}).forEach(initializers::add);initializers.addAll(this.getSpringFactoriesInstances(BootstrapRegistryInitializer.class));return initializers;
}// Bootstrapper.class
public interface Bootstrapper {default void initialize(BootstrapRegistry registry) {this.intitialize(registry);}/** @deprecated */@Deprecatedvoid intitialize(BootstrapRegistry registry);
}
多看一些源代码,让知识点串起来,进一步理解代码的