最简洁高效的方式是用 stream api:list.stream().filter(objects::nonnull).filter(s -> !s.trim().isempty()).distinct().collect(collectors.tocollection(arraylist::new)),确保结果为可变 arraylist 并兼容 java 8。

Java 中过滤 ArrayList 的空值和重复值,最简洁高效的方式是用 Stream API 结合 filter 和 distinct。
去掉 null 和空字符串(基础空值)
如果 ArrayList 元素是 String 类型,常见“空值”包括 null 和空字符串("")。可用 Objects::nonNull 排除 null,再用 String::isBlank(Java 11+)或 !s.isEmpty() 过滤空串:
list.stream().filter(Objects::nonNull).filter(s -> !s.isBlank()).collect(Collectors.toList())- 若用 Java 8,把
isBlank()换成!s.trim().isEmpty()更稳妥(兼容空白符)
去重(distinct)要小心元素的 equals/hashCode
Stream.distinct() 依赖元素的 equals() 和 hashCode()。对 String、Integer 等内置类型直接可用;但自定义对象必须正确重写这两个方法,否则去重无效:
- 例如
new Person("Alice", 25)和new Person("Alice", 25),若未重写equals,会被视为不同对象 - 建议用 Lombok 的
@EqualsAndHashCode或 IDE 自动生成
一步到位:空值 + 去重 + 收集回 ArrayList
把过滤和去重链在一起,最后转成新的 ArrayList:
List<string> cleanList = list.stream()
.filter(Objects::nonNull)
.filter(s -> !s.trim().isEmpty())
.distinct()
.collect(Collectors.toCollection(ArrayList::new));</string>
注意:toCollection(ArrayList::new) 确保结果是 ArrayList,不是默认的不可变集合(Java 16+ 的 toList() 返回不可变列表)。
替代方案:用 LinkedHashSet 保持插入顺序去重
如果不用 Stream,可借助 LinkedHashSet 同时去重和保序,再手动过滤空值:
- 先遍历原 list,跳过 null/空串,add 到 LinkedHashSet
- 再构造新 ArrayList:
new ArrayList(set) - 优势是兼容老版本 Java,且性能略优(尤其大数据量);缺点是代码稍长,不如 Stream 表达清晰
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











