Reťazec predikátov Java 8

1. Prehľad

V tomto rýchlom návode prediskutujeme rôzne spôsoby reťazenia Predikáty v prostredí Java 8.

2. Základný príklad

Najprv, pozrime sa, ako používať jednoduchý Predikát filtrovať a Zoznam mien:

@Test public void whenFilterList_thenSuccess () {List names = Arrays.asList ("Adam", "Alexander", "John", "Tom"); Výsledok zoznamu = names.stream () .filter (name -> name.startsWith ("A")) .collect (Collectors.toList ()); assertEquals (2, result.size ()); assertThat (výsledok, obsahuje ("Adam", "Alexander")); }

V tomto príklade sme filtrovali náš Zoznam mien ponechať iba mená, ktoré sa začínajú na „A“ pomocou Predikát:

name -> name.startsWith ("A")

Ale čo keby sme chceli použiť viac Predikáty?

3. Viacero filtrov

Keby sme chceli použiť viac Predikáty, jednou z možností je jednoducho reťaziť viac filtrov:

@Test public void whenFilterListWithMultipleFilters_thenSuccess () {List result = names.stream () .filter (name -> name.startsWith ("A")) .filter (name -> name.length () <5) .collect (Collectors. listovať()); assertEquals (1, result.size ()); assertThat (výsledok, obsahuje („Adam“)); }

Teraz sme aktualizovali náš príklad tak, aby filtroval náš zoznam extrakciou mien, ktoré začínajú na „A“ a majú dĺžku menšiu ako 5.

Použili sme dva filtre - pre každý jeden Predikát.

4. Zložité Predikát

Teraz, namiesto použitia viacerých filtrov, môžeme použiť jeden filter s komplexom Predikát:

@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 (výsledok, obsahuje („Adam“)); }

Táto možnosť je flexibilnejšia ako prvá, napr na zostavenie súboru môžeme použiť bitové operácie Predikáttak zložité, ako chceme.

5. Kombinovanie Predikáty

Ďalej, ak nechceme stavať komplex Predikát pomocou bitových operácií, Java 8 Predikát má užitočné metódy, ktoré môžeme kombinovať Predikáty.

Budeme kombinovať Predikáty pomocou metód Predicate.and (), Predicate.or ()a Predicate.negate ().

5.1. Predicate.and ()

V tomto príklade si zadefinujeme naše Predikáty výslovne a potom ich skombinujeme pomocou Predicate.and ():

@Test public void whenFilterListWithCombinedPredicatesUsingAnd_thenSuccess () {Predicate predicate1 = str -> str.startsWith ("A"); Predikát predikát2 = str -> str.length () <5; Výsledok zoznamu = names.stream () .filter (predicate1.and (predicate2)) .collect (Collectors.toList ()); assertEquals (1, result.size ()); assertThat (výsledok, obsahuje („Adam“)); }

Ako vidíme, syntax je pomerne intuitívna a názvy metód naznačujú typ operácie. Použitím a (), filtrovali sme naše Zoznam extrakciou iba mien, ktoré spĺňajú obe podmienky.

5.2. Predicate.or ()

Môžeme tiež použiť Predicate.or () kombinovať Predikáty.

Poďme extrahovať mená začínajúce na „J“, ako aj mená s dĺžkou menšou ako 4:

@Test public void whenFilterListWithCombinedPredicatesUsingOr_thenSuccess () {Predicate predicate1 = str -> str.startsWith ("J"); Predikát predikát2 = str -> str.length () <4; Výsledok zoznamu = names.stream () .filter (predicate1.or (predicate2)) .collect (Collectors.toList ()); assertEquals (2, result.size ()); assertThat (výsledok, obsahuje ("John", "Tom")); }

5.3. Predicate.negate ()

Môžeme použiť Predicate.negate () pri kombinovaní našich Predikáty tiež:

@Test public void whenFilterListWithCombinedPredicatesUsingOrAndNegate_thenSuccess () {Predicate predicate1 = str -> str.startsWith ("J"); Predikát predikát2 = str -> str.length () <4; Výsledok zoznamu = names.stream () .filter (predicate1.or (predicate2.negate ())) .collect (Collectors.toList ()); assertEquals (3, result.size ()); assertThat (výsledok, obsahuje ("Adam", "Alexander", "John")); }

Tu sme použili kombináciu alebo () a negovať () filtrovať Zoznam podľa mien, ktoré začínajú na „J“ alebo majú dĺžku nie menšiu ako 4.

5.4. Kombinujte Predikáty V rade

Nemusíme výslovne definovať svoje Predikáty použit a (),alebo ()a negovať ().

Môžeme ich tiež použiť inline nahodením Predikát:

@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 (výsledok, obsahuje („Adam“)); }

6. Kombinácia zbierky Predikáty

Nakoniec Pozrime sa, ako spojiť zbierku Predikáty ich znížením.

V nasledujúcom príklade máme a Zoznam z Predikáty ktoré sme kombinovali pomocou Predicate.and ():

@Test public void whenFilterListWithCollectionOfPredicatesUsingAnd_thenSuccess () {Zoznam allPredicates = nový ArrayList(); allPredicates.add (str -> str.startsWith ("A")); allPredicates.add (str -> str.contains ("d")); allPredicates.add (str -> str.length ()> 4); Výsledok zoznamu = names.stream () .filter (allPredicates.stream (). Reduce (x-> true, Predicate :: and)) .collect (Collectors.toList ()); assertEquals (1, result.size ()); assertThat (výsledok, obsahuje („Alexander“)); }

Upozorňujeme, že našu základnú identitu používame ako:

x-> pravda

Ale to bude iné, ak ich chceme kombinovať pomocou Predicate.or ():

@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 (výsledok, obsahuje ("Adam", "Alexander")); }

7. Záver

V tomto článku sme preskúmali rôzne spôsoby reťazenia predikátov v prostredí Java 8 pomocou filter (), komplex budov Predikátya kombinovanie Predikáty.

Celý zdrojový kód je k dispozícii na GitHub.