Это может быть улучшено дальше? - PullRequest
0 голосов
/ 09 декабря 2018

Я новичок в java8.Просто хотел знать, это правильный способ написания Java 8 и предложить, если данный код может быть улучшен в отношении функционального программирования Java?

public class OperationByJava8 {
    public int add(int a, int b) {
        Operation op = (num1, num2) -> num1 + num2;
        return op.operate(a, b);
    }

    public int subtract(int a, int b) {
        Operation op = (num1, num2) -> num1 - num2;
        return op.operate(a, b);
    }

    public int multiply(int a, int b) {
        Operation op = (num1, num2) -> num1 * num2;
        return op.operate(a, b);
    }

    public int devide(int a, int b) {
        Operation op = (num1, num2) -> {
            if (num2 == 0) {
                throw new IllegalArgumentException("denominator cannot be zero");
            }
            return num1 / num2;
        };
        return op.operate(a, b);
    }

    public static void main(String[] args) {
        OperationByJava9 op = new OperationByJava9();
        System.out.println("    Addition(12, 12)    :" + op.add(12, 12));
        System.out.println("    Subtract(12, 12)    :" + op.subtract(12, 12));
        System.out.println("    Multiply(12, 12)    :" + op.multiply(12, 12));
        System.out.println("    Devide  (12, 12)    :" + op.devide(12, 12));
    }

}

@FunctionalInterface
interface Operation {
    int operate(int a, int b);
}

1 Ответ

0 голосов
/ 09 декабря 2018

Ваш подход полностью подходит, и было бы неплохо продолжить.

Если вы хотите еще больше сократить код, вы можете создать одну функцию следующим образом для сложения, вычитания и умножения.

public int apply(int a, int b, IntBinaryOperator func) {            
      return func.applyAsInt(a, b);
}

, но тогда вам нужно будет создать отдельную функцию для функции деления, чтобы вызвать исключение IllegalArgumentException в случае, если вторым аргументом является 0.

Обратите внимание, что яВы использовали функциональный интерфейс IntBinaryOperator, чтобы избежать необходимости создавать интерфейс Operation, но если последний является более значимым, вы можете оставить это.

В качестве альтернативы, вы можете определить функции встроенными и затем вызывать их:

IntBinaryOperator add = (num1, num2) -> num1 + num2;
IntBinaryOperator subtract = (num1, num2) -> num1 + num2;
IntBinaryOperator multiply = (num1, num2) -> num1 + num2;
IntBinaryOperator division = (num1, num2) ->  {
        if (num2 == 0)
            throw new IllegalArgumentException("denominator cannot be zero");
        return num1 / num2;
};


System.out.println("    Addition(12, 12)    :" + add.applyAsInt(12, 12));
System.out.println("    Subtract(12, 12)    :" + subtract.applyAsInt(12, 12));
System.out.println("    Multiply(12, 12)    :" + multiply.applyAsInt(12, 12));
System.out.println("    Devide  (12, 12)    :" + division.applyAsInt(12, 12));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...