web-dev-qa-db-fra.com

Java 8 Filtre Lambda par listes

J'ai deux liste et je veux filtrer les éléments qui sont tous les deux liste. Et je veux faire cela avec l'expression lambda.

Les utilisateurs getName et Clients getUserName sont tous deux renvoyés avec String.

Voici mon exemple de code:

List<Client> clients = new ArrayList<>();
List<User> users = new ArrayList<>();
List<Client> results = new ArrayList<>();

for (Client user : users) {
    for(Client client: clients){
        if(user.getName().equals(client.getUserName())){
            result.add(client);
        }
    }
}
37
eszik.k
Predicate<Client> hasSameNameAsOneUser = 
    c -> users.stream().anyMatch(u -> u.getName().equals(c.getName()));

return clients.stream()
              .filter(hasSameNameAsOneUser)
              .collect(Collectors.toList());

Mais c'est assez inefficace, parce que c'est O (m * n). Vous feriez mieux de créer un ensemble de noms acceptables:

Set<String> acceptableNames = 
    users.stream()
         .map(User::getName)
         .collect(Collectors.toSet());

return clients.stream()
              .filter(c -> acceptableNames.contains(c.getName()))
              .collect(Collectors.toList());

Notez également que ce n'est pas strictement équivalent au code que vous avez (s'il est compilé), ce qui ajoute le même client deux fois à la liste si plusieurs utilisateurs portent le même nom que le client.

67
JB Nizet

Regarde ça:

List<Client> result = clients
    .stream()
    .filter(c -> 
        (users.stream().map(User::getName).collect(Collectors.toList())).contains(c.getName()))
        .collect(Collectors.toList());
5
LeoMandrak

Je voudrais partager un exemple pour comprendre l'utilisation de stream (). Filter

Extrait de code: Exemple de programme pour identifier un nombre pair.

import Java.util.ArrayList;
import Java.util.List;
import Java.util.stream.Collectors;

public void fetchEvenNumber(){
        List<Integer> numberList = new ArrayList<>();
        numberList.add(10);
        numberList.add(11);
        numberList.add(12);
        numberList.add(13);
        numberList.add(14);
        numberList.add(15);

        List<Integer> evenNumberListObj = numberList.stream().filter(i -> i%2 == 0).collect(Collectors.toList());
        System.out.println(evenNumberListObj);
}

La sortie sera: [10, 12, 14]

Liste evenNumberListObj = numberList.stream (). Filter (i -> i% 2 == 0) .collect (Collectors.toList ());

numberList: il s'agit d'un objet ArrayList contenant une liste de nombres.

Java.util.Collection.stream (): stream () recevra le flux de la collection, ce qui renverra le flux d'Integer.

filter: Retourne un flux qui correspond au prédicat donné. c.-à-d. basé sur la condition donnée (i -> i% 2! = 0) renvoie le flux correspondant.

collect: Quel que soit le flux de filtre de type Entier basé sur la condition de filtre, cet entier sera placé dans une liste.

2
Eswaran Venkatesan

Quelque chose comme:

clients.stream.filter(c->{
   users.stream.filter(u->u.getName().equals(c.getName()).count()>0
}).collect(Collectors.toList());

Ce n'est cependant pas un moyen terriblement efficace de le faire. À moins que les collections ne soient très petites, vous ferez mieux de créer un ensemble de noms d'utilisateur et de l'utiliser dans la condition.

1
daphshez