前言
函数式编程在java中算是一大进步,个人认为这样子编程使得编写逻辑的位置更加灵活,并且不用去为了实现一个简单的接口而去创建实现类。当接口设计不好的时候,整个实现类代码体系也是异常庞大的
经典示例
这里要请出spring大佬来给我们做一下详细演示。
具体是在doGetBean这个方法中,创建SpringBean的时候就可以看到。下面贴出部分代码
protected <T> T doGetBean(
String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
throws BeansException {
//此处省略
if (mbd.isSingleton()) {
sharedInstance = getSingleton(beanName, () -> {
try {
return createBean(beanName, mbd, args);
}
catch (BeansException ex) {
// Explicitly remove instance from singleton cache: It might have been put there
// eagerly by the creation process, to allow for circular reference resolution.
// Also remove any beans that received a temporary reference to the bean.
destroySingleton(beanName);
throw ex;
}
});
bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
}
//此处省略
}
这段代码大家都不陌生,重点就是要看这个getSingleton方法中的λ表达式
进入getSingleton方法
public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
//无关逻辑代码
try {
singletonObject = singletonFactory.getObject();
newSingleton = true;
}
//无关逻辑代码
}
当这段代码执行的时候,通过断点就会进入第一段代码中λ表达式( ()-> )中。
查看getSingleton方法中ObjectFactory<?> singletonFactory参数类型。可以发现这是一个函数式接口,并且存在一个被实现方法getObject().
@FunctionalInterface
public interface ObjectFactory<T> {
/**
* Return an instance (possibly shared or independent)
* of the object managed by this factory.
* @return the resulting instance
* @throws BeansException in case of creation errors
*/
T getObject() throws BeansException;
}
那么就可以知道,λ表达式中的处理逻辑其实就是接口方法的实现。
注意:具体使用参照这个博主写的还是挺全面的https://blog.csdn.net/zhanghua850127/article/details/100511618。再者就是尽量让这个接口扮演顶级接口角色。spring的实现就是很好的典例。