我有这个枚举:
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/