Java 8 Stream如何从用户列表中筛选出包含指定Appliance的用户
你原有写法的问题在于多次使用map操作将原始User对象转换为了电器名称,中途丢失了User对象的上下文,最终收集结果自然只能是匹配的电器名称,而非对应的用户。
要保留User对象,直接在filter阶段判断当前用户的购物篮中是否包含指定名称的电器即可,不需要提前做对象转换,参考写法如下:
// 指定要查询的电器名称 String targetName = "something1"; List<User> result = usersList.stream() .filter(user -> user.getBasket().getApplianceList() .stream() .anyMatch(appliance -> targetName.equals(appliance.getApplianceName())) ) .collect(Collectors.toList());
如果业务场景中可能存在Basket为空、电器列表为空的情况,可以提前增加非空过滤避免空指针异常:
String targetName = "something1"; List<User> result = usersList.stream() // 过滤掉购物篮为空的用户 .filter(user -> user.getBasket() != null) // 过滤掉购物篮电器列表为空的用户 .filter(user -> user.getBasket().getApplianceList() != null) .filter(user -> user.getBasket().getApplianceList() .stream() .anyMatch(appliance -> targetName.equals(appliance.getApplianceName())) ) .collect(Collectors.toList());
上述代码外层遍历所有用户,内层遍历对应用户的购物篮电器列表,通过anyMatch快速判断是否存在名称匹配的电器,只要匹配就保留当前用户,最终收集到的列表就是所有满足条件的User对象。
内容的提问来源于stack exchange,提问作者Milan Panic
相关产品推荐
相关产品推荐

