A JDK 1.8 API számos beépített funkcionális interfészt tartalmaz, például a régi Java-ban gyakran használt Comparator vagy Runnable interfészeket, amelyek @FunctionalInterface annotációkat adnak hozzá, hogy lambdákon is használhatók legyenek. Most értsük meg igazán a Funkció közös funkcióinak bejáratából.
| név | típus | leírás | | Fogyasztó | Fogyasztó< T > | T objektumokat fogad, nem tér vissza értékeket | | Állítmány | Predikátum< T > | Fogadja a T objektumot, és visszaadja a boole-t | | Funkció | Function< T, R > | Fogadja a T objektumot, és visszaadja az R objektumot | | Szállító | Beszállító< T > | T-objektumokat (pl. növényeket) biztosítsunk értékek elfogadása nélkül | | UnaryOperator | UnaryOperator | Fogadja a T objektumot, és visszaadja a T objektumot | | BinaryOperator | BinaryOperator | Két T objektumot fogadunk és T objektumokat küldjünk vissza |
Egy FunctionalInterface-ként jelölt interfészt funkcionális interfésznek neveznek, amely csak egy egyedi módszerrel rendelkezhet, de tartalmazhat az objektumosztályból örökölt metódusokat is. Ha egy interfésznek csak egy módszere van, a fordító azt fogja gondolni, hogy az funkcionális interfész. Akár funkcionális interfészről van szó, akár nem, a következő pontokat kell megjegyezni:
- Az annotáció csak az interfészeken jelölhető meg azzal, hogy "Csak egy absztrakt módszer létezik".
- A JDK8 interfész statikus és alapértelmezett módszerei nem absztrakt módszerek.
- Az interfész alapértelmezés szerint örökli a java.lang.Object címet, így ha az interfész azt mutatja, hogy a deklaráció felülírja az objektumban lévő metódust, akkor nem számít absztrakt metódnak.
- Az annotáció nem szükséges, és ha egy interfész megfelel a "funkcionális interfész" definíciójának, akkor nincs hatása annak, hogy hozzáadják-e a jegyzetet vagy sem. Ráadásul az annotáció lehetővé teszi, hogy a fordító jobban ellenőrizze. Ha nem funkcionális interfészt írsz, de hozzáadsz @FunctionInterface, a fordító hibát jelent.
- Ha két egyedi metódust definiálunk egy interfészben, egy érvénytelen '@FunctionalInterface' annotációt eredményez; A FunctionalInterfaceTest nem funkcionális interfészhiba.
java.util.function Számos osztályt tartalmaz a Java funkcionális programozásának támogatására, és a csomagban szereplő funkcionális interfészek a következők:
sorozatszám | Felület és leírás | | 1 | BiConsumer<T,U> Egy olyan műveletet képvisel, amely két bemeneti paramétert fogad el, de nem ad eredményt | | 2 | BiFunction<T,U,R> Egy olyan metódust képvisel, amely két bemeneti paramétert fogad el, és eredményt ad vissza | | 3 | BinaryOperator<T> egy olyan műveletet képvisel, amely két, azonos típusú operátorra hat, és ugyanaz típusú operátor eredményét adja vissza | | 4 | Bipredikátus<T,U> Egy kétparaméteres boolean érték módszert képvisel | | 5 | BooleanSupplier A boole-érték eredmény szolgáltatóját képviseli | | 6 | Fogyasztó<T> Egy olyan műveletet képvisel, amely elfogad egy bemeneti paramétert, de semmit sem ad vissza | | 7 | DoubleBinaryOperator egy olyan akciót képvisel, amely két kétértékű operátorra hat, és a dupla érték eredményét adja vissza. | | 8 | DoubleConsumer Egy olyan műveletet képvisel, amely kétszeres értékű paramétert fogad el, és nem ad vissza eredményt. | | 9 | DoubleFunction<R> Egy olyan metódust képvisel, amely elfogad egy dupla értékű paramétert, és az eredményt adja vissza | | 10 | Kettős predikátum Egy boole-érték módszert jelöl dupla értékparaméterrel | | 11 | DoubleSupplier A kettős értékű struktúra szolgáltatóját képviseli | | 12 | DoubleToIntFunction Elfogad egy dupla típusú bemenetet, és int-típusú eredményt ad vissza. | | 13 | DoubleToLongFunction Elfogad egy dupla típusú bemenetet, és hosszú típusú eredményt ad vissza | | 14 | DoubleUnaryOperator Ha elfogadunk egy azonos típusú paramétert duplázni, akkor a visszaadó érték típus is dupla. | | 15 | Funkció<T,R> Elfogad egy bemeneti paramétert, és eredményt ad vissza. | | 16 | IntBinaryOperator Elfogadjuk mindkét paramétert az int típusnak, és az int-típus értéket is visszaadjuk. | | 17 | IntConsumer Elfogad egy int típusú bemeneti paramétert, amelynek nincs visszaküldési értéke. | | 18 | IntFunction<R> Elfogad egy int típusú bemeneti paramétert, és eredményt ad vissza. | | 19 | Intpredikátum : Elfogad egy int bemeneti paramétert, és egy boolean eredményt ad vissza. | | 20 | IntSupplier Nincs paraméter, int típusú eredményt ad. | | 21 | IntToDoubleFunction Elfogad egy int típusú bemenetet, és dupla típusú eredményt ad vissza. | | 22 | IntToLongFunction Elfogad egy int típusú bemenetet, és hosszú típusú eredményt ad vissza. | | 23 | IntUnaryOperator Fogadjunk el egy int típusú paramétert, és add vissza, hogy a típus is int. | | 24 | LongBinaryOperator Fogadjuk el mindkét hosszút és a hosszú érték típusát is a hosszú típust. | | 25 | LongConsumer Fogadj el egy hosszú típusú bemeneti paramétert, amelynek nincs visszavételi értéke. | | 26 | LongFunction<R> Elfogad egy hosszú típusú bemeneti paramétert, és eredményt ad vissza. | | 27 | Hosszúpredikátum R elfogad egy hosszú bemeneti paramétert, és egy boole-típusú eredményt ad vissza. | | 28 | LongSupplier Paraméter nélkül, hosszú típusú eredményt ad vissza. | | 29 | LongToDoubleFunction Hosszú típusú bemenetet fogad el, és dupla típusú eredményt ad vissza. | | 30 | LongToIntFunction Elfogad egy hosszú típusú bemenetet, és egy int típusú eredményt ad vissza. | | 31 | LongUnaryOperator Elfogadunk egy azonos típusú paramétert hosszúnak, és visszaadjuk, hogy a típus értéke is hosszú. | | 32 | ObjDoubleConsumer<T> Fogadj el egy objektumtípust és egy dupla típusú bemeneti paramétert, amelynek nincs visszavételi értéke. | | 33 | ObjIntConsumer<T> Fogadjuk el a type object és type int bemeneti paramétereket visszaadási érték nélkül. | | 34 | ObjLongConsumer<T> Elfogadja a type object és type long bemeneti paramétereket anélkül, hogy értékeket adna vissza. | | 35 | Állítmány<T> Elfogad egy bemeneti paramétert, és egy Boole-eredményt ad. | | 36 | Szállító<T> Nincs paraméter, eredményt ad. | | 37 | ToDoubleBiFunction<T,U> Két bemeneti paramétert fogad el, és dupla típusú eredményt ad | | 38 | ToDoubleFunction<T> Elfogad egy bemeneti paramétert, és dupla típusú eredményt ad | | 39 | ToIntBiFunction<T,U> Fogadj el két bemeneti paramétert, és adj vissza egy int típusú eredményt. | | 40 | ToIntFunction<T> Fogadj el egy bemeneti paramétert, és küldj vissza egy int típusú eredményt. | | 41 | ToLongBiFunction<T,U> Fogadj el két bemeneti paramétert, és adj vissza egy hosszú típusú eredményt. | | 42 | ToLongFunction<T> Fogadj el egy bemeneti paramétert, és add vissza egy hosszú típusú eredményt. | | 43 | UnaryOperator<T> Fogadj el egy T típusú paramétert, és add vissza a T típusú értéket. |
ÉnA Java funkcionális interfésze a .NET/C# küldöttje, a metódust paraméterként adják meg, az alábbiak szerint:
Funkciók Gyakori módszerek és gyakorlatok
//将Function对象应用到输入的参数上,然后返回计算结果。 R apply (T t); Bár a függvény< T, R > T objektumot kap, R objektumot ad, és csak egy vevő- és visszaküldési objektumot kap, de tuplákkal kombinálva több bejövő és visszatérő érték érhető el, lásd a:
1. példa: Két értéket adjunk át, és összegezzük őket
Használhatsz egyszerű írást és lambda kifejezéseket, a kód a következő:
2. példa:
ésThen módszer
Kompose módszer
Teljes kód
Visszatérési eredmények
(Vége) |