Java 如何用数学链接 class

Java How to chain with Math class

我处于学习的基础 Java,我曾尝试搜索此答案,但也许我不知道我在搜索什么。 我想对一个数字执行多项操作,到目前为止,我知道如何做到这一点的唯一方法是让中间变量一次执行一个操作。这不是最好的方法。以下是我希望使用的主要方法中的代码:

  double sqrtAbsInput = promptForDouble("I can get the square root of the absolute value.");
  double sqrtAbsOutput = sqrtAbsInput.Math.abs().sqrt();
  System.out.println(sqrAbsOutput);

promptForDouble() method returns a double,这是我最关心的第二行。我得到的错误是

"error: double cannot be dereferenced."

我假设发生的事情是变量需要成为 Math class 方法的参数,但我知道这也可能与变量是原始类型有关。

你必须这样做:

System.out.println(Math.sqrt(Math.abs(sqrtAbsInput)));

abssqrt 不是 double 的方法(这是一个原始方法,所以它无论如何都没有任何方法 - 如错误消息中所述重新获取),但是 Math 的静态方法将 double 作为参数并且 return 一个 double 结果:

double sqrtAbsOutput = Math.sqrt(Math.abs(sqrtAbsInput));

Math class 未实现 "builder pattern"(出于效率原因),但您可以创建自己的允许链接的 Math class 实现。

这是一个例子:

public class MathBuilder {
    private double value;

    public MathBuilder(double value) {
        this.value = value;
    }

    public MathBuilder abs() {
        value = Math.abs(value);
        return this;
    }

    public MathBuilder sqrt() {
        value = Math.sqrt(value);
        return this;
    }

    // other builder-math methods...

    public double build() {
        return value;
    }
}

用法:

double result = new MathBuilder(-10).abs().sqrt().build();

或 Java 8:

public class MathBuilder {
    private double value;

    public MathBuilder(double value) {
        this.value = value;
    }

    public MathBuilder apply(DoubleUnaryOperator o) {
        value = o.applyAsDouble(value);
        return this;
    }

    public double build() {
        return value;
    }
}

用法:

double result = new MathBuilder(-10)
        .apply(Math::abs)
        .apply(Math::sqrt)
        .build();