Java数组需通过Stream或自定义容器才能使用函数式接口遍历;Arrays.stream()是最常用方式,基本类型返回专用流(如IntStream),引用类型返回泛型Stream;可链式调用filter、map、reduce等操作实现函数式编程。

Java数组本身不直接支持函数式接口遍历,但通过包装成流(Stream)或自定义容器,就能结合 Consumer、Function 等函数式接口实现简洁、可组合的操作。
用 Arrays.stream() 配合 Consumer 处理每个元素
这是最常用也最直观的方式。`Arrays.stream()` 将数组转为 Stream,再用 `forEach()` 接收一个 `Consumer
- 基本类型数组(如
int[])调用Arrays.stream(arr)会返回IntStream,其forEach()参数是IntConsumer - 引用类型数组(如
String[])则返回Stream<String>,可用标准Consumer<String> - 避免在 lambda 中修改原数组元素——函数式接口只负责“使用”,不改变数组结构
示例:
int[] nums = {1, 2, 3, 4, 5};
Arrays.stream(nums)
.filter(n -> n % 2 == 0) // IntPredicate
.map(n -> n * 2) // IntUnaryOperator
.forEach(System.out::println); // IntConsumer自定义数组类暴露 forEach 方法
若想像集合一样直接调用 forEach(Consumer),可封装数组并实现该方法。这本质上是手动桥接数组与函数式接口。
立即学习“Java免费学习笔记(深入)”;
- 内部用传统 for 循环遍历,把每个元素传给传入的
Consumer - 注意泛型限制:基本类型需用包装类(如
Integer),或单独写原始类型版本 - 适合复用场景,比如频繁做“遍历+打印/校验/收集”等固定模式
示例(简化版):
public class IntArray {
private final int[] data;
public IntArray(int... values) { this.data = values; }
public void forEach(IntConsumer action) {
for (int v : data) action.accept(v);
}
}
// 使用:
new IntArray(10, 20, 30).forEach(v -> System.out.println("Value: " + v));配合其他函数式接口做转换或聚合
单纯遍历只是起点;真正体现函数式优势的是链式组合操作。
-
map()+Function:转换元素,如String::toUpperCase -
filter()+Predicate:筛选符合条件的元素 -
reduce()+BinaryOperator:聚合计算,如求和、拼接 - 注意性能:基本类型数组走
IntStream等专用流,避免装箱开销
示例(字符串数组处理):
String[] words = {"hello", "world", "java"};
List<String> upper = Arrays.stream(words)
.map(String::toUpperCase) // Function<String, String>
.filter(s -> s.length() > 4) // Predicate<String>
.collect(Collectors.toList());不推荐直接对数组用迭代器
数组没有内置 iterator() 方法,强行转成 List(如 Arrays.asList(arr))再迭代,仅适用于引用类型数组,且返回的是固定大小列表——修改会抛 UnsupportedOperationException。
- 基本类型数组无法用
Arrays.asList()正确转换(会把整个数组当一个元素) - 这不是函数式接口的合理用法,属于绕路操作
- 真要迭代,优先选 Stream 或封装后的 forEach


















