在Java开发中,处理数组时过滤空元素或空数组是常见的需求,无论是避免空指针异常(NullPointerException),还是确保数据的有效性,掌握正确的过滤方法都至关重要,本文将系统介绍Java中过滤空数组的多种方式,涵盖基础循环、Stream API、工具类等场景,帮助开发者根据实际需求选择最合适的解决方案。

基础概念:明确“空”的定义
在开始过滤前,需先明确“空”的具体含义。“空数组”包含两种情况:一是长度为0的数组(如new int[0]),二是null引用(未初始化的数组),而“空元素”则指数组中的值为null(引用类型)或默认值(如基本类型的0、false等,需根据业务判断是否视为“空”),过滤String[]数组时,可能需要移除null和空字符串;过滤int[]时,可能需要移除0值。
过滤数组中的空元素(针对引用类型)
对于引用类型数组(如String[]、Object[]),过滤空元素(null或空字符串)是最常见的场景,以下是两种主流实现方式:
使用循环遍历(传统方式)
通过循环遍历数组,将非空元素存入新数组,需注意,新数组的长度需提前计算(或使用动态集合如ArrayList过渡)。
String[] originalArray = {"a", "", "b", null, "c"};
List<String> resultList = new ArrayList<>();
for (String item : originalArray) {
if (item != null && !item.isEmpty()) {
resultList.add(item);
}
}
String[] filteredArray = resultList.toArray(new String[0]);
// 结果:["a", "b", "c"]
优点:逻辑直观,兼容所有Java版本;缺点:代码稍显冗长,需手动处理集合与数组的转换。
使用Stream API(Java 8+推荐)
Stream API提供了更简洁的函数式编程方式,通过filter()方法结合Objects.nonNull和String::isEmpty等 Predicate 过滤条件,一行代码即可完成过滤。

String[] originalArray = {"a", "", "b", null, "c"};
String[] filteredArray = Arrays.stream(originalArray)
.filter(Objects::nonNull) // 过滤null
.filter(s -> !s.isEmpty()) // 过滤空字符串
.toArray(String[]::new); // 转换为数组
// 结果:["a", "b", "c"]
优点:代码简洁,可读性强,支持链式调用;缺点:需要Java 8及以上版本,大数据量时需注意流操作的性能开销。
过滤空数组(从数组集合中移除空数组)
当处理多个数组的集合(如List<int[]>)时,可能需要移除其中为null或长度为0的空数组,此时可结合List的removeIf()方法或Stream的filter()实现。
使用List.removeIf()(适用于List场景)
假设有一个List<String[]>,需移除null或长度为0的数组:
List<String[]> list = Arrays.asList(
new String[]{"a", "b"},
null,
new String[]{},
new String[]{"c"}
);
list.removeIf(arr -> arr == null || arr.length == 0);
// 结果:[["a", "b"], ["c"]]
优点:直接在原集合上操作,无需额外创建中间集合;缺点:仅适用于List等集合类型,不适用于原始数组。
使用Stream过滤(适用于数组或集合)
若输入是数组(如String[][]),可通过Stream过滤空数组:

String[][] arrays = {
{"a", "b"},
null,
{},
{"c"}
};
String[][] filteredArrays = Arrays.stream(arrays)
.filter(Objects::nonNull) // 过滤null数组
.filter(arr -> arr.length > 0) // 过滤长度为0的数组
.toArray(String[][]::new);
// 结果:[["a", "b"], ["c"]]
使用工具类简化操作(Apache Commons/Guava)
第三方工具类提供了现成的过滤方法,能进一步减少代码量。
Apache Commons Lang
依赖commons-lang3库,使用ArrayUtils过滤空元素:
String[] originalArray = {"a", "", "b", null, "c"};
String[] filteredArray = ArrayUtils.removeAllOccurences(originalArray, null); // 先移除null
filteredArray = Arrays.stream(filteredArray)
.filter(s -> !s.isEmpty())
.toArray(String[]::new);
Google Guava
依赖guava库,使用Iterables或Streams(需Java 8+):
String[] originalArray = {"a", "", "b", null, "c"};
List<String> filteredList = Lists.newArrayList(originalArray)
.stream()
.filter(Objects::nonNull)
.filter(s !s.isEmpty())
.collect(Collectors.toList());
String[] filteredArray = filteredList.toArray(new String[0]);
最佳实践与注意事项
- 性能考虑:大数据量时,Stream的并行流(
parallelStream())可提升过滤效率,但需注意线程安全问题;循环方式在简单场景下性能更稳定。 - 空指针安全:始终优先处理
null数组(如使用Objects.requireNonNull或Optional避免NPE)。 - 可读性优先:简单过滤推荐Stream API,复杂业务逻辑可结合循环或工具类,避免过度追求简洁牺牲可读性。
- 业务场景适配:明确“空”的定义(如是否视为空),根据需求调整过滤条件,避免一刀切。
通过以上方法,开发者可以灵活应对Java中数组过滤的各种场景,无论是基础循环、Stream API还是工具类,核心逻辑都是“遍历+条件判断”,选择合适的方式能让代码更简洁、高效且易于维护。

















