You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 07:30:04