在Java开发中,我们经常会遇到这样的场景:有多个平行的数组,比如一个存用户姓名,一个存用户年龄,希望把它们合并成User对象组成的集合。使用Stream API可以用函数式风格非常自然地完成这一转换,而不必写繁琐的下标循环。

什么是并行数组
并行数组指的是多个长度相同、下标一一对应的数组。例如下面的数据:
String[] names = {"张三", "李四", "王五"};
int[] ages = {20, 25, 30};
names[0]与ages[0]描述的是同一个人的姓名和年龄,这种结构就是并行数组。
使用Stream API进行转换
借助IntStream.range可以生成下标流,再通过mapToObj把每个下标映射为一个对象,最后收集成List。
import java.util.*;
import java.util.stream.*;
class User {
String name;
int age;
User(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return name + ":" + age;
}
}
public class Demo {
public static void main(String[] args) {
String[] names = {"张三", "李四", "王五"};
int[] ages = {20, 25, 30};
List<User> users = IntStream.range(0, names.length)
.mapToObj(i -> new User(names[i], ages[i]))
.collect(Collectors.toList());
users.forEach(System.out::println);
}
}
利用并行流提升性能
如果数组很大,可以在流上调用parallel()开启并行处理:
List<User> users = IntStream.range(0, names.length)
.parallel()
.mapToObj(i -> new User(names[i], ages[i]))
.collect(Collectors.toList());
注意事项
- 并行数组长度必须一致,否则会出现数组越界。
- 并行流适用于计算密集且数据量大的情况,小数组直接用串行流更合适。
- mapToObj中的操作应是无状态的,避免共享可变变量引发线程安全问题。
总结
通过Stream API的IntStream.range配合mapToObj,我们能用声明式代码把并行数组转成对象集合。这种方式比传统循环更易读,也更符合函数式编程思想。在合理评估数据规模后,使用parallel()还能进一步利用多核能力。
JavaStream_API函数式编程修改时间:2026-07-28 04:15:14