Czy w Javie możliwe jest, aby lambda akceptowała wiele różnych typów?
To znaczy: pojedyncza zmienna działa:
Function <Integer, Integer> adder = i -> i + 1;
System.out.println (adder.apply (10));
Varargs również działa:
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 })));
Ale chcę czegoś, co akceptuje wiele różnych typów argumentów, np .:
Function <String, Integer, Double, Person, String> myLambda = a , b, c, d-> {
[DO STUFF]
return "done stuff"
};
Głównym zastosowaniem są małe funkcje wbudowane w funkcje dla wygody.
Rozejrzałem się po google i sprawdziłem pakiet funkcji Java, ale nie mogłem znaleźć. czy to możliwe?
Function<One, Function<Two, Function<Three, Function<Four, Function<Five, Six>>>>> func = a -> b -> c -> d -> e -> 'z';
Function
której koliduje,java.util.function.Function<T,R>
która może być niejasna dla początkujących.W przypadku czegoś z 2 parametrami możesz użyć
BiFunction
. Jeśli potrzebujesz więcej, możesz zdefiniować własny interfejs funkcji, na przykład:Jeśli jest więcej niż jeden parametr, należy umieścić listę argumentów w nawiasach, na przykład:
źródło
W tym przypadku możesz użyć interfejsów z domyślnej biblioteki (java 1.8):
Jest mały (nie najlepszy) przykład domyślnej metody w interfejsie:
źródło
Aby skorzystać z lambda: Istnieją trzy typy operacji:
1. Zaakceptuj parametr -> Konsument
2. Przetestuj zwrot parametru boolean -> Predykat
3. Manipuluj parametrem i wartością zwracaną -> Funkcja
Interfejs funkcjonalny Java do dwóch parametrów:
Interfejs jednoparametrowy Predykat
konsumenta Funkcja Interfejs dwuparametrowy BiConsumer BiPredicate BiFunction
W przypadku więcej niż dwóch osób musisz utworzyć funkcjonalny interfejs w następujący sposób (typ konsumenta):
źródło
Inną alternatywą, nie jestem pewien, czy dotyczy to twojego konkretnego problemu, ale w niektórych może mieć zastosowanie, jest użycie
UnaryOperator
biblioteki java.util.function. gdzie zwraca ten sam typ, który podałeś, więc umieszczasz wszystkie zmienne w jednej klasie i czy jest to parametr:W tym przypadku klasa, którą masz,
Person
może mieć wiele zmiennych instancji i nie będzie musiała zmieniać parametru wyrażenia lambda.Dla zainteresowanych napisałem notatki na temat korzystania z biblioteki java.util.function: http://sysdotoutdotprint.com/index.php/2017/04/28/java-util-function-library/
źródło
Możesz również skorzystać z biblioteki jOOL - https://github.com/jOOQ/jOOL
Posiada już przygotowane interfejsy funkcyjne z różną liczbą parametrów. Na przykład możesz użyć
org.jooq.lambda.function.Function3
, etc odFunction0
doFunction16
.źródło