W jaki sposób mogę napisać z Java 8 z zamknięciami obsługuje metodę, która przyjmuje jako argument funkcji i funkcji powrotu jako wartość?Wyrażenia lambda i funkcje wyższego rzędu
Odpowiedz
W języku Java Lambda API główną klasą jest java.util.function.Function.
Możesz użyć odniesienia do tego interfejsu w taki sam sposób, jak zrobiłbyś z wszystkimi innymi odniesieniami: utwórz je jako zmienne, zwróć je w wyniku obliczeń i tak dalej.
Oto dość prosty przykład, który może pomóc:
public class HigherOrder {
public static void main(String[] args) {
Function<Integer, Long> addOne = add(1L);
System.out.println(addOne.apply(1)); //prints 2
Arrays.asList("test", "new")
.parallelStream() // suggestion for execution strategy
.map(camelize) // call for static reference
.forEach(System.out::println);
}
private static Function<Integer, Long> add(long l) {
return (Integer i) -> l + i;
}
private static Function<String, String> camelize = (str) -> str.substring(0, 1).toUpperCase() + str.substring(1);
}
Jeśli trzeba przejść więcej niż 1 parametr, proszę spojrzeć do compose
metody, ale jej użycie jest dość trudne.
Zasadniczo z mojej opinii zamknięcia i lambdy w Javie są w zasadzie cukrem składniowym i wydają się nie mieć wszystkich możliwości programowania funkcjonalnego.
dziękuję bardzo za odpowiedź! Czy wiesz, czy to ma zastosowanie: dodaj (8) (10), ponieważ to jest bardzo nudne: dodaj (8) .apply (10) – xdevel2000
Niestety wydaje się, że nie jest dozwolone, przynajmniej - teraz – n1ckolas
n1ckolas, przepraszam , Nie znajduję żadnej metody komponowania ... gdzie mogę szukać przykładu napisania funkcji o większej liczbie parametrów? – xdevel2000
[Zamknięcia specyfikacji projektu Java (autor: Neal Gafter i Peter von der Ahé)] (http://javac.info/) –
@Quoi Ta strona internetowa odnosi się do propozycji, które umarły lata temu. Postęp w kierunku wdrożenia Java 8 patrz http://lambdafaq.org –
@MauriceNaftalin dzięki –