java - 将 java.util.function.Function 定义为 static fi

在我的代码中,我们必须将欧元转换为欧分:将 BigDecimal 作为输入,我们必须将它乘以 100。

我们需要多次应用这种转换,所以我们决定使用 java.util.function 中的 UnaryOperator:

private static final UnaryOperator<BigDecimal> CONVERT_EURO_TO_CENTS =
        input -> input.multiply(BigDecimal.valueOf(100)).setScale(0, RoundingMode.DOWN);

然后我们使用CONVERT_EURO_TO_CENTS如下:

[.....]

    CONVERT_EURO_TO_CENT.apply(<aBigDecimal>)

[.....]

UnaryOperator 声明为常量 (static final) 以避免多线程环境中的数据不一致(线程安全)会很危险吗?

最佳答案

不,这不危险。

如果您制作一个可变对象并将其放在静态字段中,那么不同的线程可能会更改其状态并引起麻烦。

虽然静态最终字段包含对 lambda 的引用,但没有任何内容是可变的。它没有任何多线程可以篡改的状态。 BigDecimal 上的每个操作都是线程安全的,BigDecimal 是不可变的。即使 BigDecimal 不是线程安全的,其他线程也无法访问传递给 lambda 的参数。

顺便说一句,如果您使用局部变量实现 lambda,那仍然是线程安全的,唯一的状态被限制在执行该方法的堆栈帧中。

考虑一下,如果您要将此 lambda 放在一个变量中并在不同的地方使用它,您不妨使用静态方法。你没有得到任何使它成为 lambda 的东西。如果您需要将其作为参数传递,您仍然可以使用方法引用来实现。

关于java - 将 java.util.function.Function 定义为 static final,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67003072/

相关文章:

angular - 类型 'null' 的参数不可分配给参数 Angular

r - 错误延迟加载包 'devtools' 失败

reactjs - Eslint错误: Do not nest ternary expression

r - 如何根据在ggplot中分配的概率对单词重新排序

python - 替代全局变量

numpy - 在 Julia 中替代 python 的 np.meshgrid()?

java - 使用 Java Streams 返回单词出现的句子计数和列表

flutter - 解决依赖关系 : pub finished with exit code 1

java - 使用 java Supplier 接口(interface)创建条件对象

javascript - 使用 JavaScript 中的动态属性对数组中的所有对象项求和