web-dev-qa-db-ja.com

Java 8リストによるLambdaフィルター

私は2つのリストがあり、両方のリストに含まれる要素をフィルタします。そして、私はラムダ式でこれを行いたいです。

ユーザーgetNameとクライアントgetUserNameは両方とも文字列で返されます。

これが私のサンプルコードです。

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());

しかし、O(m * n)であるため、これは非常に非効率的です。受け入れ可能な名前のセットを作成することをお勧めします。

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

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

また、複数のユーザーがクライアントと同じ名前を持っている場合、リストに同じクライアントを2回追加するコード(コンパイルされている場合)と厳密に同等ではないことに注意してください。

67
JB Nizet

これを見て:

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

Stream()。filterの使用法を理解するための例を共有したいと思います

コードスニペット:偶数を識別するためのサンプルプログラム。

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);
}

出力は[10、12、14]になります

リストevenNumberListObj = numberList.stream()。filter(i-> i%2 == 0).collect(Collectors.toList());

numberList:これは、数値のリストを含むArrayListオブジェクトです。

Java.util.Collection.stream():stream()は、Streamを返すコレクションのストリームを取得します整数の。

filter:指定された述語に一致するストリームを返します。つまり、指定された条件(i-> i%2!= 0)に基づいて、一致するストリームを返します。

collect:フィルター条件に基づいた整数フィルターのストリームが何であれ、それらの整数はリストに入れられます。

2

何かのようなもの:

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

ただし、これは非常に効率的な方法ではありません。コレクションが非常に小さい場合を除き、ユーザー名のセットを作成し、それを条件で使用することをお勧めします。

1
daphshez