Java 8 lanac predikata

1. Pregled

U ovom brzom vodiču, razgovarat ćemo o različitim načinima ulančavanja Predikati u Javi 8.

2. Osnovni primjer

Prvi, pogledajmo kako koristiti jednostavan Predikat za filtriranje a Popis imena:

@Test public void whenFilterList_thenSuccess () {Imena popisa = Arrays.asList ("Adam", "Alexander", "John", "Tom"); Popis rezultata = names.stream () .filter (name -> name.startsWith ("A")) .collect (Collectors.toList ()); assertEquals (2, result.size ()); assertThat (rezultat, sadrži ("Adam", "Aleksandar")); }

U ovom smo primjeru filtrirali svoje Popis imena ostavljati samo imena koja započinju s "A" pomoću Predikat:

name -> name.startsWith ("A")

Ali što ako bismo željeli primijeniti višestruku primjenu Predikati?

3. Više filtera

Kad bismo željeli primijeniti višestruku Predikati, jedna je mogućnost jednostavno ulančati više filtara:

@Test public void whenFilterListWithMultipleFilters_thenSuccess () {List result = names.stream () .filter (name -> name.startsWith ("A")) .filter (name -> name.length () <5) .collect (Collectors. izlistati()); assertEquals (1, result.size ()); assertThat (rezultat, sadrži ("Adam")); }

Sad smo ažurirali naš primjer za filtriranje popisa izdvajanjem imena koja počinju s "A" i čija je duljina manja od 5.

Koristili smo dva filtra - po jedan za svaki Predikat.

4. Složeno Predikat

Sada, umjesto da koristimo više filtara, možemo koristiti jedan filtar sa kompleksom Predikat:

@Test public void whenFilterListWithComplexPredicate_thenSuccess () {List result = names.stream () .filter (name -> name.startsWith ("A") && name.length () <5) .collect (Collectors.toList ()); assertEquals (1, result.size ()); assertThat (rezultat, sadrži ("Adam")); }

Ova je opcija fleksibilnija od prve, kao možemo koristiti bitovne operacije za izgradnju Predikatkoliko god složeni želimo.

5. Kombiniranje Predikati

Dalje, ako ne želimo graditi kompleks Predikat pomoću bitovnih operacija, Java 8 Predikat ima korisne metode koje možemo koristiti za kombiniranje Predikati.

Kombinirat ćemo Predikati koristeći metode Predikat.i (), Predikat.ili (), i Predikat.negate ().

5.1. Predikat.i ()

U ovom ćemo primjeru definirati naš Predikati izričito, a zatim ćemo ih kombinirati pomoću Predikat.i ():

@Test public void whenFilterListWithCombinedPredicatesUsingAnd_thenSuccess () {Predikat predikat1 = str -> str.startsWith ("A"); Predikat predikat2 = str -> str.length () <5; Rezultat popisa = imena.stream () .filter (predikat1.i (predikat2)) .collect (Collectors.toList ()); assertEquals (1, result.size ()); assertThat (rezultat, sadrži ("Adam")); }

Kao što vidimo, sintaksa je prilično intuitivna, a nazivi metoda sugeriraju vrstu operacije. Koristeći i(), filtrirali smo svoje Popis izvlačenjem samo imena koja ispunjavaju oba uvjeta.

5.2. Predikat.ili ()

Možemo i koristiti Predikat.ili () kombinirati Predikati.

Izdvojimo imena koja počinju s “J”, kao i imena čija je duljina manja od 4:

@Test public void whenFilterListWithCombinedPredicatesUsingOr_thenSuccess () {Predikat predikat1 = str -> str.startsWith ("J"); Predikat predikat2 = str -> str.length () <4; Rezultat popisa = imena.stream () .filter (predikat1.ili (predikat2)) .collect (Collectors.toList ()); assertEquals (2, result.size ()); assertThat (rezultat, sadrži ("John", "Tom")); }

5.3. Predikat.negate ()

Možemo koristiti Predikat.negate () kada kombiniramo naše Predikati također:

@Test public void whenFilterListWithCombinedPredicatesUsingOrAndNegate_thenSuccess () {Predikat predikat1 = str -> str.startsWith ("J"); Predikat predikat2 = str -> str.length () <4; Rezultat popisa = imena.stream () .filter (predikat1.ili (predikat2.negate ())) .collect (Collectors.toList ()); assertEquals (3, result.size ()); assertThat (rezultat sadrži ("Adam", "Aleksandar", "Ivan")); }

Ovdje smo koristili kombinaciju ili() i negirati() za filtriranje Popis imenima koja počinju s "J" ili imaju duljinu koja nije manja od 4.

5.4. Kombinirati Predikati U redu

Ne trebamo izričito definirati svoje Predikati koristiti i(),ili(), i negirati().

Također ih možemo koristiti i ubacujući Predikat:

@Test public void whenFilterListWithCombinedPredicatesInline_thenSuccess () {List result = names.stream () .filter ((((Predicate) name -> name.startsWith ("A")). And (name -> name.length () <5)) .collect (Collectors.toList ()); assertEquals (1, result.size ()); assertThat (rezultat, sadrži ("Adam")); }

6. Kombiniranje zbirke Predikati

Konačno, da vidimo kako povezati zbirku Predikati njihovim smanjenjem.

U sljedećem primjeru imamo a Popis od Predikati koje smo kombinirali koristeći Predikat.i ():

@Test public void whenFilterListWithCollectionOfPredicatesUsingAnd_thenSuccess () {Popis allPredicates = novi ArrayList(); allPredicates.add (str -> str.startsWith ("A")); allPredicates.add (str -> str.contens ("d")); allPredicates.add (str -> str.length ()> 4); Navedi rezultat = imena.stream () .filter (allPredicates.stream (). Reduce (x-> true, Predicate :: and)) .collect (Collectors.toList ()); assertEquals (1, result.size ()); assertThat (rezultat, sadrži ("Aleksandar")); }

Imajte na umu da svoj osnovni identitet koristimo kao:

x-> istina

Ali to će biti drugačije ako ih želimo kombinirati pomoću Predikat.ili ():

@Test public void whenFilterListWithCollectionOfPredicatesUsingOr_thenSuccess () {List result = names.stream () .filter (allPredicates.stream (). Reduce (x-> false, Predicate :: or)) .collect (Collectors.toList ()); assertEquals (2, result.size ()); assertThat (rezultat, sadrži ("Adam", "Aleksandar")); }

7. Zaključak

U ovom smo članku istražili različite načine ulančavanja predikata u Javi 8 pomoću filtar(), građevinski kompleks Predikati, i kombiniranje Predikati.

Cjeloviti izvorni kod dostupan je na GitHubu.