将 MathContext 设置为 BinaryOperator 参考方法
Set MathContext to BinaryOperator reference methods
我有这个枚举:
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);
在文档和可用于应用的方法中,我看到任何选项。
第一个选择是实现类似 TriFunction<P1, P2, P3, R>
的东西并按如下方式修改您的代码:
public enum Operator {
add("+", (t0, t1, mc) -> t0.add(t1, mc)),
subtract("-", (t0, t1, mc) -> t0.subtract(t1, mc)),
multiply("*", (t0, t1, mc) -> t0.multiply(t1, mc)),
divide("/", (t0, t1, mc) -> t0.divide(t1, mc)),
mod("%", (t0, t1, mc) -> t0.remainder(t1, mc));
Operator(final String symbol, final TriFunction<BigDecimal, BigDecimal, MathContext, BigDecimal> operation) {
this.symbol = symbol;
this.operation = operation;
}
public BinaryOperator<BigDecimal, BigDecimal, MathContext, BigDecimal> getOperation() {
return operation;
}
}
但是您必须自己实现 TriFunction
(或在线查找)才能使用,因为 java 不会从头开始提供类似的东西。
一个更简单的(IMO 快速和肮脏的)方法可能是这样的:
public enum Operator {
add("+"), subtract("-"), multiply("*"), divide("/"), mod("%");
// Attributes and constructors
public BigDecimal apply(BigDecimal t1, BigDecimal t2, MathContext mc) {
switch (this) {
case add: return t1.add(t2, mc);
case subtract: return t1.subtract(t2, mc);
case multiply: return t1.multiply(t2, mc);
case divide: return t1.divide(t2, mc);
case mod: return t1.remainder(t2, mc);
}
return null; // never reached
}
}
你可以通过
更轻松地调用它
BigDecimal result = enum.apply(t0, t1, mc);
根据用例,您可以将自定义功能接口的范围保持在最低限度:
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
两个都可以,直接like
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));
我有这个枚举:
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);
在文档和可用于应用的方法中,我看到任何选项。
第一个选择是实现类似 TriFunction<P1, P2, P3, R>
的东西并按如下方式修改您的代码:
public enum Operator {
add("+", (t0, t1, mc) -> t0.add(t1, mc)),
subtract("-", (t0, t1, mc) -> t0.subtract(t1, mc)),
multiply("*", (t0, t1, mc) -> t0.multiply(t1, mc)),
divide("/", (t0, t1, mc) -> t0.divide(t1, mc)),
mod("%", (t0, t1, mc) -> t0.remainder(t1, mc));
Operator(final String symbol, final TriFunction<BigDecimal, BigDecimal, MathContext, BigDecimal> operation) {
this.symbol = symbol;
this.operation = operation;
}
public BinaryOperator<BigDecimal, BigDecimal, MathContext, BigDecimal> getOperation() {
return operation;
}
}
但是您必须自己实现 TriFunction
(或在线查找)才能使用,因为 java 不会从头开始提供类似的东西。
一个更简单的(IMO 快速和肮脏的)方法可能是这样的:
public enum Operator {
add("+"), subtract("-"), multiply("*"), divide("/"), mod("%");
// Attributes and constructors
public BigDecimal apply(BigDecimal t1, BigDecimal t2, MathContext mc) {
switch (this) {
case add: return t1.add(t2, mc);
case subtract: return t1.subtract(t2, mc);
case multiply: return t1.multiply(t2, mc);
case divide: return t1.divide(t2, mc);
case mod: return t1.remainder(t2, mc);
}
return null; // never reached
}
}
你可以通过
更轻松地调用它BigDecimal result = enum.apply(t0, t1, mc);
根据用例,您可以将自定义功能接口的范围保持在最低限度:
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
两个都可以,直接like
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));