制作一个功能性界面
@FunctionalInterface
public RulesFact {
Object getPropertyValue(String propertyName);
}
方法内的 lambda 实例。
public RulesFact rulesFactImpl(Object o) {
return propertyName->PropertyAccessorFactory.forBeanPropertyAccess(o).getPropertyValue(propertyName);
}
这个方法和上面的有什么区别吗?在上面的例子中,每次执行 lambda 时都会调用 PropertyAccessorFactory.forBeanPropertyAccess
方法吗?线程安全有区别吗?
public RulesFact rulesFactImpl(Object o) {
BeanWrapper accessor = PropertyAccessorFactory.forBeanPropertyAccess(o);
return propertyName->accessor.getPropertyValue(propertyName);
}
关于上述反射实用程序的 Javadocs:Package org.springframework.beans
最佳答案
调用 RulesFact.getPropertyValue
时执行 lambda 表达式。
这意味着每次调用 RulesFact.getPropertyValue
时,第一个版本都会调用 PropertyAccessorFactory.forBeanPropertyAccess(o)
,如果访问器可以随时间变化,那么这很好。
第二个版本在调用rulesFactImpl
时调用PropertyAccessorFactory.forBeanPropertyAccess(o)
,并缓存该值,这对性能有好处,但如果访问器可以更改则不好随着时间的推移。
仅供引用:第二个版本可以使用方法引用编写:
public RulesFact rulesFactImpl(Object o) {
BeanWrapper accessor = PropertyAccessorFactory.forBeanPropertyAccess(o);
return accessor::getPropertyValue;
}
关于Java Lambda 捕获还是重新执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68038800/