Java Predicate

Exemple de prédicat avec filter

@Test
void devrait_contenir_fruits_commencant_par_P() {

    List < String > fruits = Arrays.asList("Pomme", "Banane", "Poire", "Citron", "PĂȘche", "Mangue");

    Predicate < String > commenceParP = fruit - > fruit.startsWith("P");

    /* filtrer la liste. Obtient tous les noms de fruits commençant par P */
    List < String > resultats = fruits.stream()
                                      .filter(commenceParP)
                                      .collect(Collectors.toList());

    //devrait avoir une taille de 3
    assertEquals(3, resultats.size());

    //devrait contenir Pomme, Poire et PĂȘche
    assertTrue(resultats.containsAll(Arrays.asList("Pomme", "Poire", "PĂȘche")));

}

Exemple avec une fonction prédicat

@Test
void devrait_contenir_fruits_commencant_par_P_avec_commencantPar() {

    List < String > fruits = Arrays.asList("Pomme", "Banane", "Poire", "Citron", "PĂȘche", "Mangue");

    /* filtrer la liste. Obtient tous les noms de fruits commençant par P */
    List < String > resultats = fruits.stream()
                                      .filter(commencantPar("P"))
                                      .collect(Collectors.toList());

    //devrait avoir une taille de 3
    assertEquals(3, resultats.size());

    //devrait contenir Pomme, Poire et PĂȘche
    assertTrue(resultats.containsAll(Arrays.asList("Pomme", "Poire", "PĂȘche")));

}

public Predicate < String > commencantPar(String lettres) {
    return str - > str.startsWith(lettres);
}

Example avec la méthode or()

@Test
void devrait_contenir_fruits_commencant_par_P_ou_par_B() {

    List < String > fruits = Arrays.asList("Pomme", "Banane", "Poire", "Citron", "PĂȘche", "Mangue");

    /* filtrer la liste. Obtient tous les noms de fruits commençant par P ou par B */
    List < String > resultats = fruits.stream()
                                      .filter(commencantPar("P").or(commencantPar("B")))
                                      .collect(Collectors.toList());

    //devrait avoir une taille de 4
    assertEquals(4, resultats.size());

    //devrait contenir Pomme, Poire, PĂȘche et Banane
    assertTrue(resultats.containsAll(Arrays.asList("Pomme", "Poire", "PĂȘche", "Banane")));

}

On peut aussi cumuler avec d'autres fonctions.

@Test
void devrait_contenir_fruits_commencant_par_P_ou_finissant_par_n() {

    List < String > fruits = Arrays.asList("Pomme", "Banane", "Poire", "Citron", "PĂȘche", "Mangue");

    /* filtrer la liste. Obtient tous les noms de fruits commençant par P ou finissant par n */
    List < String > resultats = fruits.stream()
                                      .filter(commencantPar("P").or(finissantPar("n")))
                                      .collect(Collectors.toList());

    //devrait avoir une taille de 4
    assertEquals(4, resultats.size());

    //devrait contenir Pomme, Poire, PĂȘche et Citron
    assertTrue(resultats.containsAll(Arrays.asList("Pomme", "Poire", "PĂȘche", "Citron")));

}

public Predicate < String > finissantPar(String lettres) {
    return str - > str.endsWith(lettres);
}

Exemple avec la méthode and()

@Test
void devrait_contenir_fruits_commencant_par_Po_et_finissant_par_re() {

    List < String > fruits = Arrays.asList("Pomme", "Banane", "Poire", "Citron", "PĂȘche", "Mangue");

    /* filtrer la liste. Obtient tous les noms de fruits commençant par Po et finissant par re */
    List < String > resultats = fruits.stream()
                                      .filter(commencantPar("Po").and(finissantPar("re")))
                                      .collect(Collectors.toList());

    //devrait avoir une taille de 1
    assertEquals(1, resultats.size());

    //devrait contenir Poire
    assertTrue(resultats.containsAll(Arrays.asList("Poire")));

}

Exemple de programmation impérative

On peut aussi utiliser l'interface fonctionnelle Predicate de maniÚre impérative.

@Test
void devrait_contenir_fruits_commencant_par_P_iteratif() {

    List < String > fruits = Arrays.asList("Pomme", "Banane", "Poire", "Citron", "PĂȘche", "Mangue");

    /* filtrer la liste. Obtient tous les noms de fruits commençant par Po et finissant par re */
    List < String > resultats = new ArrayList < String > ();
    for (String fruit: fruits) {
        /* Si le prédicat renvoie true */
        if (commencantPar("Po").and(finissantPar("re")).test(fruit)) {
            resultats.add(fruit);
        }
    }

    //devrait avoir une taille de 1
    assertEquals(1, resultats.size());

    //devrait contenir Poire
    assertTrue(resultats.containsAll(Arrays.asList("Poire")));

}

Commentaires