Java Lambda 捕获还是重新执行?

标签 java lambda java-8

制作一个功能性界面

@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/

相关文章:

Java 8 流 - 查找 Map<String, List<Object>> 的最大计数值

java - 非法状态异常 : "Duplicate key" for Collectors. toMap()

java - JList 中的动态可见行数

java - 轻松休息 : How to send an easy POST request with parameters and api key

java - Apple 公证将 dylib 文件列为未签名

c# - 将字符串转换为 Linq lambda 表达式

java - 在闭包内 sleep - Java 8 lambda

java - JEXL - 如何获取未知变量的所有警告消息?

c++ - 仔细检查锁定模式 - 在传递给 call_once 的 lambda 中捕获

java - 使用java流影响一些逻辑列表