如何使用Stream在User列表中查找其phones字段包含指定手机号的对象
原有Stream代码错误原因
你的实现有三个核心问题导致无法运行:
filter方法要求传入的函数返回boolean类型,但你内层调用u.getPhones().stream().filter(...)返回的是Stream<Phone>对象,类型不匹配,编译阶段就会报错。- 没有处理
findAll()返回null、User.getPhones()返回null的边界场景,运行时容易触发空指针异常。 findFirst()返回的是Optional<User>类型,不能直接作为User类型返回,需要处理无匹配结果的场景。
正确Stream实现方案
public User findByPhone(String number) { var users = findAll(); // 先处理用户集合为null的边界情况 if (users == null) { return null; } return users.stream() // 过滤掉手机号集合为null的用户 .filter(u -> u.getPhones() != null) // 用anyMatch判断当前用户是否存在匹配的手机号,返回布尔值符合filter要求 .filter(u -> u.getPhones().stream() // number写前面避免p.getValue()为null时空指针 .anyMatch(p -> number.equals(p.getValue()))) // 取第一个匹配的用户,无匹配则返回null,和原始for循环逻辑对齐 .findFirst() .orElse(null); }
逻辑对齐提示
你原始的for循环逻辑如果存在多个用户绑定了同一个目标手机号,最终会返回最后一个遍历到的匹配用户。如果要严格对齐这个逻辑,可以把上面代码中的findFirst().orElse(null)替换为reduce((first, second) -> second).orElse(null)即可。
内容的提问来源于stack exchange,提问作者Dmitriy
相关产品推荐
相关产品推荐

