私は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);
}
}
}
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回追加するコード(コンパイルされている場合)と厳密に同等ではないことに注意してください。
これを見て:
List<Client> result = clients
.stream()
.filter(c ->
(users.stream().map(User::getName).collect(Collectors.toList())).contains(c.getName()))
.collect(Collectors.toList());
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:フィルター条件に基づいた整数フィルターのストリームが何であれ、それらの整数はリストに入れられます。
何かのようなもの:
clients.stream.filter(c->{
users.stream.filter(u->u.getName().equals(c.getName()).count()>0
}).collect(Collectors.toList());
ただし、これは非常に効率的な方法ではありません。コレクションが非常に小さい場合を除き、ユーザー名のセットを作成し、それを条件で使用することをお勧めします。