Java遍历一维数组过滤数据需明确条件、选合适方式(增强for/传统for/Stream)、构造结果并保持顺序;增强for适用于纯过滤,传统for适合需索引或生成同类型数组,Stream提升表达力但有装箱开销。

Java 中遍历一维数组并实现数据过滤,核心在于明确过滤条件、选择合适遍历方式、构造新结果(或就地修改),同时兼顾可读性与性能。不需要额外框架,原生语法即可高效完成。
明确过滤逻辑再编码
过滤本质是“保留满足条件的元素”,因此第一步必须清晰定义布尔表达式。比如:筛选正数、偶数、字符串长度大于 3、对象属性不为空等。避免边写边改条件,先在注释中写清楚语义:
-
错误示范:
if (arr[i] > 0 && arr[i] % 2 == 0)—— 意图模糊,未说明是“正偶数” -
推荐写法:
// 保留所有正偶数+ 后续条件
优先使用增强 for 循环(for-each)
对纯过滤(不依赖索引、不修改原数组)场景,增强 for 最简洁安全:
int[] nums = {1, -2, 4, 0, 6, -5};
List<Integer> filtered = new ArrayList<>();
for (int num : nums) {
if (num > 0 && num % 2 == 0) { // 正偶数
filtered.add(num);
}
}
// filtered = [4, 6]
注意:它无法获取当前索引,也不支持遍历时删除原数组元素(数组本身不可变,但 List 可)。
立即学习“Java免费学习笔记(深入)”;
需要索引或动态调整时用传统 for
当过滤逻辑依赖位置(如“跳过第 0 个和最后一个”)、或需构建同类型数组(而非 List)时,传统 for 更直接:
- 统计满足条件元素个数 → 分配结果数组容量,避免扩容开销
- 用两个指针:一个遍历原数组,一个指向结果数组写入位置
- 示例:提取非零元素到新 int 数组
int[] arr = {0, 3, 0, 7, 0, 2};
int count = 0;
for (int x : arr) if (x != 0) count++;
int[] result = new int[count];
int idx = 0;
for (int x : arr) {
if (x != 0) result[idx++] = x;
}
// result = [3, 7, 2]
利用 Stream API(Java 8+)提升表达力
函数式风格让意图更直观,尤其适合链式处理(过滤+映射+归约):
int[] nums = {1, -2, 4, 0, 6, -5};
int[] evens = Arrays.stream(nums)
.filter(x -> x > 0 && x % 2 == 0)
.toArray();
// evens = [4, 6]
注意:Stream 会装箱/拆箱(int ↔ Integer),高频小数组下传统循环略快;但代码更短、易组合、线程友好。
不复杂但容易忽略:过滤后是否需要保持原始顺序?绝大多数情况要,上述所有方法默认维持顺序。若需去重或排序,应在过滤后单独调用 distinct() 或 sorted()。


















