Arrays.asList返回的列表不可修改,过滤空元素应优先用Stream:Arrays.stream(arr).filter(s -> s != null && !s.isBlank()),Java 8用s != null && !s.trim().isEmpty()。

Java数组转List后filter空元素失效?别直接用Arrays.asList
因为 Arrays.asList 返回的是固定大小的内部列表,底层仍绑定原数组,对 null 或空字符串的过滤操作(比如 removeIf)可能抛 UnsupportedOperationException,或者根本没效果。
- 原生数组(如
String[])本身不支持流式过滤,必须先转为真正可操作的集合 -
Arrays.asList(arr)生成的是Arrays.ArrayList(非java.util.ArrayList),不可增删 - 正确做法是用
new ArrayList(Arrays.asList(arr))拷贝一份,再 filter;但更推荐跳过这步,直接走 Stream
用Stream.filter处理String[]里的null和空字符串
这是最干净、无副作用的方式:不依赖中间 List,一步到位。注意区分 null 和 "" —— 它们在 Java 中是不同对象,Objects.nonNull 只管前者,String::isBlank(Java 11+)或 s != null && !s.trim().isEmpty() 才覆盖后者。
- 过滤
null:Arrays.stream(arr).filter(Objects::nonNull) - 过滤
null+ 空白字符串(含空格、制表符等):Arrays.stream(arr).filter(s -> s != null && !s.isBlank()) - 如果用 Java 8,把
isBlank()换成!s.trim().isEmpty(),但注意s.trim()对null会 NPE,所以顺序不能错 - 最终转回数组用
.toArray(String[]::new),转ArrayList用.collect(Collectors.toCollection(ArrayList::new))
ArrayList里混着null或"",removeIf怎么写才安全
如果你已经有一个 ArrayList<string></string>,且里面可能有 null,直接写 list.removeIf(String::isBlank) 会触发 NullPointerException,因为 isBlank() 不接受 null 参数。
- 安全写法是显式判空:
list.removeIf(s -> s == null || s.isBlank()) - 或者分两步:
list.removeIf(Objects::isNull)再list.removeIf(String::isBlank) - 注意
removeIf是就地修改,没有返回值;别误以为它像 Stream 一样返回新集合 - 如果原始 list 需要保留,务必先
new ArrayList(originalList)拷贝
性能与兼容性提醒:isBlank() vs isEmpty() vs trim().isEmpty()
String::isBlank 是 Java 11 引入的,语义最准(空白字符包括空格、\t、\n、\r 等),但老项目不能用;isEmpty() 只判断长度是否为 0,对 " " 返回 false;trim().isEmpty() 兼容性好,但每次调用都新建字符串对象,小数据无所谓,高频场景要注意 GC 压力。
立即学习“Java免费学习笔记(深入)”;
- Java 11+:优先用
s == null || s.isBlank() - Java 8:用
s == null || s.trim().isEmpty(),别漏掉前面的s == null - 避免写成
s.trim().isEmpty()单独使用——null一来就崩
Arrays.asList 的“假 ArrayList”陷阱。不是所有带 ArrayList 字样的类,都真能删元素。










