В Java возможно ли лямбда принимать несколько разных типов?
Т.е. работает одна переменная:
Function <Integer, Integer> adder = i -> i + 1;
System.out.println (adder.apply (10));
Varargs также работают:
Function <Integer [], Integer> multiAdder = ints -> {
int sum = 0;
for (Integer i : ints) {
sum += i;
}
return sum;
};
//....
System.out.println ((multiAdder.apply (new Integer [] { 1, 2, 3, 4 })));
Но я хочу что-то, что может принимать много разных типов аргументов, например:
Function <String, Integer, Double, Person, String> myLambda = a , b, c, d-> {
[DO STUFF]
return "done stuff"
};
Основное использование - иметь небольшие встроенные функции внутри функций для удобства.
Я осмотрел Google и проверил функциональный пакет Java, но не смог найти. Это возможно?
Function<One, Function<Two, Function<Three, Function<Four, Function<Five, Six>>>>> func = a -> b -> c -> d -> e -> 'z';
Function
столкновение сjava.util.function.Function<T,R>
которым может быть непонятным для начинающих.Для чего-то с 2 параметрами, вы можете использовать
BiFunction
. Если вам нужно больше, вы можете определить свой собственный интерфейс функции, например так:Если есть более одного параметра, вам нужно поместить скобки вокруг списка аргументов, например так:
источник
Для этого случая вы можете использовать интерфейсы из библиотеки по умолчанию (Java 1.8):
Существует небольшой (не лучший) пример метода по умолчанию в интерфейсе:
источник
Чтобы использовать лямбду: Существует три типа операций:
1. Принять параметр -> Потребитель
2. Тестовый параметр вернуть логическое значение -> Предикат
3. Управление параметром и возвращаемое значение -> Функция
Функциональный интерфейс Java с двумя параметрами:
однопараметрический интерфейс Функция предиката
потребителя Двухпараметрический интерфейс BiConsumer BiPredicate BiFunction
Для более чем двух вам необходимо создать функциональный интерфейс следующим образом (тип Consumer):
источник
Другая альтернатива, не уверенная, применима ли она к вашей конкретной проблеме, но к некоторым она может быть применима, это использовать
UnaryOperator
в библиотеке java.util.function. где он возвращает тот же тип, который вы укажете, поэтому вы помещаете все свои переменные в один класс и это как параметр:Таким образом, класс, который у вас есть, в этом случае
Person
может иметь множество переменных экземпляра и не должен будет изменять параметр вашего лямбда-выражения.Для тех, кто заинтересован, я написал заметки о том, как использовать библиотеку java.util.function: http://sysdotoutdotprint.com/index.php/2017/04/28/java-util-function-library/
источник
Вы также можете использовать библиотеку jOOL - https://github.com/jOOQ/jOOL
Он уже подготовил функциональные интерфейсы с различным количеством параметров. Например, вы можете использовать
org.jooq.lambda.function.Function3
и т. Д. ОтFunction0
доFunction16
.источник