java - Java 流 - 基于子项的过滤器
问题描述
我有每个人的列表都有列表。手机有brandName 和modelNumber。如何使用 Java 流过滤 modelNumber 等于某个值的 Person 列表。在下面的代码中,我需要过滤 modelNumber 为 10 的 Persons
public static void main(String[] args) {
Integer searchModel = 10;
List<Person> persons = new ArrayList<>();
CellPhone a1 = new CellPhone("Nokia", 10);
CellPhone a11 = new CellPhone("Sony", 11);
List<CellPhone> phoneList = new ArrayList<>();
phoneList.add(a11);
phoneList.add(a1);
Person p1 = new Person("John", phoneList);
CellPhone a2 = new CellPhone("Nokia", 10);
CellPhone a22 = new CellPhone("Sony", 11);
phoneList = new ArrayList<>();
phoneList.add(a2);
phoneList.add(a22);
Person p2 = new Person("Doe", phoneList);
CellPhone a3 = new CellPhone("Apple", 20);
CellPhone a33 = new CellPhone("Samsung", 22);
phoneList = new ArrayList<>();
phoneList.add(a3);
phoneList.add(a33);
Person p3 = new Person("Rose", phoneList);
CellPhone a4 = new CellPhone("Nokia", 10);
CellPhone a44 = new CellPhone("Sony", 11);
phoneList = new ArrayList<>();
phoneList.add(a4);
phoneList.add(a44);
Person p4 = new Person("Kumar", phoneList);
CellPhone a5 = new CellPhone("Apple", 20);
CellPhone a55 = new CellPhone("Samsung", 22);
phoneList = new ArrayList<>();
phoneList.add(a5);
phoneList.add(a55);
Person p5 = new Person("Angel", phoneList);
CellPhone a6 = new CellPhone("Apple", 20);
CellPhone a66 = new CellPhone("Samsung", 22);
phoneList = new ArrayList<>();
phoneList.add(a6);
phoneList.add(a66);
Person p6 = new Person("Prince", phoneList);
persons.add(p1);
persons.add(p2);
persons.add(p3);
persons.add(p4);
persons.add(p5);
persons.add(p6);
persons.stream().filter(p -> p.getPhones().stream().filter(x -> x.getModelNumber().equals(searchModel)).collect(Collectors.toList()));
// expected Person list is John, Doe and Kumar
// above filter gives me an error cannot convert from list to boolean
}
解决方案
.filter
期望Predicate
并且您的代码没有此用于外部.filter
.
你可以这样做:
persons.stream()
.filter(p -> p.getPhones().stream()
.anyMatch(x -> x.getModelNumber() == searchModel)
).collect(Collectors.toList()));
请注意,如果返回类型getModelNumber()
是int
,则需要使用==
而不是.equals
。
推荐阅读
- c++ - 如何在 VSCODE 中使用 OpenCV c++
- java - 将大型 PDF 文件与 PDFBox 合并时出错 - 缺少文件结尾标记“%%EOF”
- c# - 如何在弹出窗口后面显示弹出窗口?
- javascript - React/Redux 如何传递参数来修改 API
- php - 更新一个匹配 twitter 喜欢提及的正则表达式以允许点
- python - 收到错误时如何删除 NaN:ValueError:输入包含 NaN
- python-3.x - 如何编写一个 for 循环,将代码模板写入 python 3.7 中的文件
- reactjs - JsHint 提示 React 语法中缺少分号的错误
- javascript - DevExtreme React 网格
- c++ - 如何在没有打印语句的情况下报告用户输入错误?