Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

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

#java


У меня есть 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));

    


Ответы

Ответ 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)

Ответ 2



Да, метод в качестве параметра передать можно. @FunctionalInterface interface TriFunction { 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 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); } }

Комментариев нет:

Отправить комментарий