首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将MathContext设置为BinaryOperator引用方法

将MathContext设置为BinaryOperator引用方法
EN

Stack Overflow用户
提问于 2017-02-26 20:29:45
回答 2查看 152关注 0票数 2

我有这样的观点:

代码语言:javascript
复制
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,在执行这样的操作时可以很容易地做到这一点:

代码语言:javascript
复制
MathContext mc = MathContext.DECIMAL32;
BigDecimal t0 = new BigDecimal(100);
BigDecimal t1 = new BigDecimal(2); 
BigDecimal result = t0.add(t1, mc);

但是,如果我想在枚举中使用对BinaryOperator的引用,我就找不到给它提供MathContext的方法了

代码语言:javascript
复制
BigDecimal result = enum.getOperation().apply(t0, t1);

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-27 12:33:35

根据用例,可以将自定义功能接口的作用域保持在最低限度:

代码语言:javascript
复制
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可以直接使用,例如

代码语言:javascript
复制
BigDecimal result = Operator.add
    .apply(new BigDecimal(100), new BigDecimal(2), MathContext.DECIMAL32);

或者得到标准的BinaryOperator<BigDecimal>,比如

代码语言:javascript
复制
BigDecimal result = Operator.add.getOperation(MathContext.DECIMAL32)
    .apply(new BigDecimal(100), new BigDecimal(2));
票数 3
EN

Stack Overflow用户

发布于 2017-02-27 08:35:25

第一个选项是实现类似于TriFunction<P1, P2, P3, R>的内容,并按如下方式修改代码:

代码语言:javascript
复制
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并不能从头开始提供类似的东西。

一种更简单(海事组织既快又脏)的办法可能是:

代码语言:javascript
复制
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
    }
}

你可以说这更容易

代码语言:javascript
复制
BigDecimal result = enum.apply(t0, t1, mc);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42473859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档