java - 将 MathContext 设置为 BinaryOperator 引用方法

标签 java enums java-8 bigdecimal binary-operators

我有这个枚举:

public enum Operator {
    add("+", BigDecimal::add),
    subtract("-", BigDecimal::subtract),
    multiply("*", BigDecimal::multiply),
    divide("/", BigDecimal::divide),
    mod("%", BigDecimal::remainder);

    Operator(final String symbol, final BinaryOperator<BigDecimal> operation) {
        this.symbol = symbol;
        this.operation = operation;
    }

    public BinaryOperator<BigDecimal> getOperation() {
        return operation;
    }
}

我想使用一些MathContext,在执行这样的操作时可以很容易地做到这一点:

MathContext mc = MathContext.DECIMAL32;
BigDecimal t0 = new BigDecimal(100);
BigDecimal t1 = new BigDecimal(2); 
BigDecimal result = t0.add(t1, mc);

但是,如果我想在枚举中使用对 BinaryOperator 的引用,我看不到为它提供 MathContext 的方法:

BigDecimal result = enum.getOperation().apply(t0, t1);

在文档或可用于应用的方法中,我看到了任何选项。

最佳答案

根据用例,您可以将自定义功能接口(interface)的范围保持在最低限度:

public enum Operator {
    add("+", BigDecimal::add),
    subtract("-", BigDecimal::subtract),
    multiply("*", BigDecimal::multiply),
    divide("/", BigDecimal::divide),
    mod("%", BigDecimal::remainder);

    private interface TriFunc {
        BigDecimal apply(BigDecimal a, BigDecimal b, MathContext c);
    }
    private String symbol;
    private TriFunc operation;

    Operator(String symbol, TriFunc operation) {
        this.symbol = symbol;
        this.operation = operation;
    }

    public BinaryOperator<BigDecimal> getOperation(MathContext c) {
        return (a, b) -> operation.apply(a, b, c);
    }

    // you can also provide a direct method:
    public BigDecimal apply(BigDecimal a, BigDecimal b, MathContext c) {
        return operation.apply(a, b, c);
    }
}

所以任何使用 Operator 的人枚举,不需要知道内部使用的 TriFunc界面。 Operator两者都可以,直接点赞

BigDecimal result = Operator.add
    .apply(new BigDecimal(100), new BigDecimal(2), MathContext.DECIMAL32);

或获取标准 BinaryOperator<BigDecimal>喜欢

BigDecimal result = Operator.add.getOperation(MathContext.DECIMAL32)
    .apply(new BigDecimal(100), new BigDecimal(2));

关于java - 将 MathContext 设置为 BinaryOperator 引用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42473859/

相关文章:

java - 处理 - ScreenToWorld 坐标函数?

mysql - MySQL 如何处理存储不存在的 ENUM 值?

java - 遇到顺序友好/不友好的终端操作 vs 并行/顺序 vs 有序/无序流

java - 匹配器。 appendReplacement 未添加起始内容

Java:如何制作一个创建数组的循环?

java - 哈希表Java插入

来自 char 的 C++ 枚举

c++ - 比较枚举类型时出现逻辑错误

java - 将 List<CustomerOrder> 分组到 Map<Gender, Money>

java - JLS 是否需要内联最终字符串常量?