Java 8中如何过滤对象列表?以及如何将指定遍历赋值代码改写为Java 8实现?
嘿,这就来帮你搞定这两个Java 8相关的问题!
一、Java 8中实现对象列表过滤的方法
Java 8引入的Stream API让列表过滤变得简洁又高效,核心思路是把列表转为流,用filter()配合lambda表达式定义过滤规则,最后收集结果即可。
举个直观的例子:假设我们有一个User类,要过滤出年龄大于18的成年用户:
// 示例User类 class User { private String name; private int age; // 构造器、getter方法省略 } // 过滤逻辑实现 List<User> userList = Arrays.asList(new User("Alice", 20), new User("Bob", 17)); List<User> adultUsers = userList.stream() .filter(user -> user.getAge() > 18) // 这里写你的过滤条件 .collect(Collectors.toList());
如果过滤条件需要复用,还可以定义Predicate接口来封装规则:
Predicate<User> isAdult = user -> user.getAge() > 18; List<User> adultUsers = userList.stream() .filter(isAdult) .collect(Collectors.toList());
二、代码改写为Java 8风格
原代码嵌套了多层if判断,用Java 8的Stream+Optional可以大幅简化逻辑,同时避免空指针风险:
ListeTiers tiers = wsTiers.rechercheTiers(serviceContext, params); Optional.ofNullable(tiers) .map(ListeTiers::getTiers) // 安全获取listeTiers,若tiers为null则直接跳过后续逻辑 .flatMap(List::stream) // 将List<Tiers>转为Stream<Tiers>,方便遍历 .filter(t -> id.equals(t.getI())) // 过滤出id匹配的Tiers对象 .findFirst() // 找到第一个匹配的元素就停止遍历,比原for循环更高效 .ifPresent(t -> { // 链式处理activite和code的非空判断 Optional.ofNullable(t.getActivite()) .map(Activite::getCode) .ifPresent(result::setCode); // 只有code不为null时,才设置到result中 });
改写亮点:
- Optional.ofNullable():彻底替代手动
null != xxx的判断,避免空指针异常 - 链式调用:把嵌套的逻辑拆成连贯的步骤,可读性大幅提升
- findFirst():找到目标元素后立即停止遍历,比原代码的全量循环更高效
- ifPresent():只有当Optional中的值存在时才执行后续操作,完美替代多层嵌套
if
内容的提问来源于stack exchange,提问作者Soumaya Ghidhaoui
相关产品推荐
相关产品推荐

