Java如何与数学类链接

Java如何与数学类链接,java,method-chaining,Java,Method Chaining,我已经掌握了学习Java的基本知识,我已经尝试过搜索这个答案,但可能我不知道我在搜索什么。 我想对一个数字执行多个操作,到目前为止,我知道的唯一方法是让中间变量一次执行一个操作。这不是最好的办法。以下是我的主要方法中的代码,我希望能够使用这些代码: double sqrtAbsInput = promptForDouble("I can get the square root of the absolute value."); double sqrtAbsOutput = sqrtAbs

我已经掌握了学习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()
方法返回一个double,这是我最关心的第二行。我得到的错误是

“错误:无法取消对double的引用。”


我假设变量需要是
Math
类方法的参数,但我理解它也可能与作为基元类型的变量有关。

您必须这样做:

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

您必须这样做:

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

abs
sqrt
不是
double
的方法(这是一个原语,因此它没有任何方法-正如您收到的错误消息中所指出的那样),而是
Math
的静态方法,它将
double
作为参数并返回
double
结果:

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

abs
sqrt
不是
double
的方法(这是一个原语,因此它没有任何方法-正如您收到的错误消息中所指出的那样),而是
Math
的静态方法,它将
double
作为参数并返回
double
结果:

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

Math
类不实现“构建器模式”(出于效率原因),但您可以创建自己的数学类实现,它允许链接

以下是一个例子:

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();
double result = new MathBuilder(-10)
        .apply(Math::abs)
        .apply(Math::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).abs().sqrt().build();
double result = new MathBuilder(-10)
        .apply(Math::abs)
        .apply(Math::sqrt)
        .build();

Math
类不实现“构建器模式”(出于效率原因),但您可以创建自己的数学类实现,它允许链接

以下是一个例子:

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();
double result = new MathBuilder(-10)
        .apply(Math::abs)
        .apply(Math::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).abs().sqrt().build();
double result = new MathBuilder(-10)
        .apply(Math::abs)
        .apply(Math::sqrt)
        .build();

那正是我要找的!伟大的那正是我要找的!伟大的这非常准确地回答了我的问题。我犹豫着接受它,因为我不会使用这个答案,尽管它不折不扣地回答了我的问题。耸耸肩,小心你想要什么。@KaariLandry没问题:)这是对我问题的直截了当的回答。我犹豫着接受它,因为我不会使用这个答案,尽管它不折不扣地回答了我的问题。耸耸肩小心你的愿望。@KaariLandry没问题:)