Какой FunctionalInterface я должен использовать? - PullRequest
0 голосов
/ 22 декабря 2018

Я учился писать несколько лямбда-представлений как FunctionalInterface .Итак, чтобы добавить два целых числа, которые я использовал:

BiFunction<Integer, Integer, Integer> biFunction = (a, b) -> a + b;
System.out.println(biFunction.apply(10, 60));

Дает мне вывод 70 .Но если я напишу это как

BinaryOperator<Integer, Integer, Integer> binaryOperator = (a, b) -> a + b;

, я получу сообщение об ошибке: 1011 *

Неверное количество аргументов типа: 3;требуется: 1

Разве BinaryOperator не является ребенком BinaryFunction?Как я могу улучшить это?

Ответы [ 3 ]

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

Разве BinaryOperator не является дочерним объектом BinaryFunction?

Да, это так.Если вы посмотрите на исходный код BinaryOperator, вы увидите:

public interface BinaryOperator<T> extends BiFunction<T,T,T> {
    // ...
}

Так что вам просто нужно исправить свой синтаксис:

BinaryOperator<Integer> binaryOperator = (a, b) -> a + b;
System.out.println(binaryOperator.apply(10, 60));

Как мне его улучшить?

Вы можете использовать IntBinaryOperator.Это упрощает синтаксис еще больше:

IntBinaryOperator binaryOperator = (a, b) -> a + b;
System.out.println(binaryOperator.applyAsInt(10, 60));
0 голосов
/ 22 декабря 2018
BiFunction<Integer, Integer, Integer> biFunction = (a, b) -> a + b;

может быть представлен

BinaryOperator<Integer> binaryOperator = (a, b) -> a + b;

Но обычно вы хотите выполнять арифметические вычисления на int, а не Integer, чтобы избежать распаковки для вычисления (целое число в int) и упаковкиеще раз, чтобы вернуть результат (int в Integer):

IntBinaryOperator intBinaryOperator = (a, b) -> a + b;

В качестве примечания можно также использовать ссылку на метод вместо лямбда-выражения для вычисления суммы между двумя int с.
Integer.sum(int a, int b) - это то, что вы ищете:

IntBinaryOperator biFunction = Integer::sum;
0 голосов
/ 22 декабря 2018

BinaryOperator

Поскольку BinaryOperator работает с операндами одного типа и результатом является .т.е. BinaryOperator<T>.

Разве BinaryOperator не является дочерним объектом BinaryFunction?

Да.BinaryOperator делает extends BiFunction.Но обратите внимание на состояние документации (мое форматирование):

Это специализация BiFunction для случая, когда операнды и результат все одного типа .

Полное представление:

BinaryOperator<T> extends BiFunction<T,T,T>

, следовательно, ваш код должен работать с

BinaryOperator<Integer> binaryOperator = (a, b) -> a + b;
System.out.println(binaryOperator.apply(10, 60));

IntBinaryOperator

Если вы должны иметь дело с двумя примитивными целыми числами, как в настоящее время в вашем примере ( добавить два целых числа, которые я использовал ), вы можете использовать IntBinaryOperator FunctionalInterface as

IntBinaryOperator intBinaryOperator = (a, b) -> a + b;
System.out.println(intBinaryOperator.applyAsInt(10, 60));

Представляет операцию с двумя int -значными операндами и выдачу целочисленного результата.Это специализация примитивного типа из BinaryOperator для int.


Я использую Integer, могу ли я использовать IntBinaryOperator

Да, вы все еще можете использовать его , но обратите внимание, что представление IntBinaryOperator

Integer first = 10;
Integer second = 60;
IntBinaryOperator intBinaryOperator = new IntBinaryOperator() {
    @Override
    public int applyAsInt(int a, int b) {
        return Integer.sum(a, b);
    }
};
Integer result = intBinaryOperator.applyAsInt(first, second); 

повлечет за собой накладные расходы распаковка first и second на примитивы, а затем автобокс сумма в виде вывода на result типа Integer.

Примечание : будьте осторожны с использованием нулевых безопасных значений для Integer, хотя в противном случае вы, вероятно, получите NullPointerException.

...