Как сократить данный участок кода или можно ли в java передать метод в качестве параметра метода?

160
14 декабря 2019, 20:30

У меня есть 3 метода и для каждого прописаны одни и те же участки кода. как сократить данный участок кода?

    double n = COUNT;
    while (Math.abs(rectangleMethod(a, b, 2 * n) - rectangleMethod(a, b, n)) > EXACTNESS) {
        n *= 2;
    }
    System.out.print("Rectangle method: n = " + n + ": ");
    System.out.println(rectangleMethod(a, b, n));
    n = COUNT;
    while (Math.abs(trapezoidMethod(a, b, 2 * n) - trapezoidMethod(a, b, n)) > EXACTNESS) {
        n *= 2;
    }
    System.out.print("Trapezoid method: n = " + n + ": ");
    System.out.println(trapezoidMethod(a, b, n));
    n = COUNT;
    while (Math.abs(simpsonFormul(a, b, 2 * n) - simpsonFormul(a, b, n)) > EXACTNESS) {
        n *= 2;
    }
    System.out.print("Simpson method: n = " + n + ": ");
    System.out.println(simpsonFormul(a, b, n));, b, n));
Answer 1

Не совсем знаю, как у вас устроен ваш код, но вот, к примеру, как можно сократить

Интерфейс метода

interface Method {
        double calc(double a, double b, double c);
}

Соответвенно вам нужно будет реализовать классы для ваших трех типов вычислений(к примеру SimpsonMethod и т.д.)

И добавить класс обработки, наподобии

class Calc {
    private final static double EXACTNESS = 100;
    private final static double COUNT = 0;   
    private Method method;
    public Calc(Method method) {
        this.method = method;
    }
    double doMethod(double a, double b) {
        double n = COUNT;
        while (Math.abs(method.calc(a, b, 2 * n) - method.calc(a, b, n)) > EXACTNESS) {
            n *= 2;
        }
        System.out.print(method.getClass().getSimpleName() + " method: n = " + n + ": ");
        return n;
    }
}

И вызов, соответсвенно, будет наподобии:

new Calc(new SimpsonMethod()).doMethod(a, b);

И так для каждого из методов(реализаций интерфейса Method)

Answer 2

Да, метод в качестве параметра передать можно.

@FunctionalInterface
interface TriFunction<F, S, T, R> {
    R apply(F first, S second, T third);
}
class SomeClass {
    public static double rectangleMethod(int x, int y, double z) {
        return 1;
    }
    public static double trapezoidMethod(int x, int y, double z) {
        return 2;
    }
    public static double simpsonFormul(int x, int y, double z) {
        return 3;
    }
}
public class Demo {
    private static final int COUNT = 42;
    private static final int EXACTNESS = 0;
    private static void someMethod(TriFunction<Integer, Integer, Double, Double> function, int a, int b) {
        double n = COUNT;
        while (Math.abs(function.apply(a, b, 2 * n) - function.apply(a, b, n)) > EXACTNESS) {
            n *= 2;
        }
        System.out.format("Результат %.2f при n = %.2f%n", function.apply(a, b, n), n);
    }
    public static void main(String[] args) {
        System.out.print("Rectangle method: ");
        someMethod(SomeClass::rectangleMethod, 1, 2);
        System.out.print("Trapezoid method: ");
        someMethod(SomeClass::trapezoidMethod, 1, 2);
        System.out.print("Simpson method: ");
        someMethod(SomeClass::simpsonFormul, 1, 2);
    }
}
READ ALSO
Загрузка рекламы в приложении

Загрузка рекламы в приложении

У меня есть приложение на androidЕсть реклама за вознаграждения (использую appodeal) В слушателе такой код

128
как в процессе ввода записать записать информацию в строку?

как в процессе ввода записать записать информацию в строку?

Нужна помощь, как в процессе ввода записать все стрелки в строку, и вывести их в консоль после цикла ?

131
Как изменить ориентацию игры LibGDX на вертикальную?

Как изменить ориентацию игры LibGDX на вертикальную?

Как изменить ориентацию игры LibGDX на вертикальную?

133
Не удаётся внести данные в MySQL таблицу

Не удаётся внести данные в MySQL таблицу

Использую preparedStatement, вот код:

166