在Java 8及更高版本中,Stream API为集合和数组的数据处理提供了非常便捷的方式,对象数组作为常用的数据结构,如何正确使用Stream API处理其中的元素,是很多开发者需要掌握的基础技能。

对象数组转换为Stream流的两种方式
对象数组本身不是集合类型,无法直接调用stream()方法,需要先将其转换为流,常用的转换方式有两种。
1. 使用Arrays.stream()方法
这是最直接的方式,java.util.Arrays类提供了重载的stream()方法,支持所有类型的数组转换,对于对象数组会返回对应的Stream<T>类型。
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class ArrayStreamDemo {
public static void main(String[] args) {
// 定义对象数组
User[] userArray = new User[]{
new User("张三", 20),
new User("李四", 25),
new User("王五", 18)
};
// 使用Arrays.stream()转换为流
Stream<User> userStream = Arrays.stream(userArray);
// 过滤年龄大于18的用户,收集为List
List<User> adultUsers = userStream
.filter(user -> user.getAge() > 18)
.collect(Collectors.toList());
System.out.println("成年用户数量:" + adultUsers.size());
}
}
2. 使用Stream.of()方法
Stream.of()方法也可以接收数组作为参数,但需要注意,如果传入的是对象数组,它会将整个数组作为一个元素,因此需要先通过flatMap处理,或者直接使用Arrays.stream()更合适。不过如果明确传入数组元素,也可以直接使用。
import java.util.stream.Stream;
public class StreamOfDemo {
public static void main(String[] args) {
User[] userArray = new User[]{
new User("张三", 20),
new User("李四", 25)
};
// 错误用法:会将整个数组作为一个元素
Stream<User[]> wrongStream = Stream.of(userArray);
// 正确用法:结合flatMap展开数组
Stream<User> correctStream = Stream.of(userArray).flatMap(Arrays::stream);
// 或者直接传入数组元素
Stream<User> directStream = Stream.of(userArray[0], userArray[1]);
}
}
常用流操作示例
转换得到流之后,就可以使用Stream API提供的各类中间操作和终止操作处理对象数组中的元素。
过滤操作
使用filter()方法可以筛选符合条件的对象,比如筛选年龄大于20的用户:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class FilterDemo {
public static void main(String[] args) {
User[] userArray = new User[]{
new User("张三", 20),
new User("李四", 25),
new User("王五", 18)
};
List<User> filteredUsers = Arrays.stream(userArray)
.filter(user -> user.getAge() > 20)
.collect(Collectors.toList());
filteredUsers.forEach(user -> System.out.println(user.getName()));
}
}
映射操作
使用map()方法可以提取对象的某个属性,比如提取所有用户的姓名:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class MapDemo {
public static void main(String[] args) {
User[] userArray = new User[]{
new User("张三", 20),
new User("李四", 25)
};
List<String> userNames = Arrays.stream(userArray)
.map(User::getName)
.collect(Collectors.toList());
System.out.println("所有用户姓名:" + userNames);
}
}
排序操作
使用sorted()方法可以对对象数组按指定规则排序,比如按年龄升序排序:
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
public class SortDemo {
public static void main(String[] args) {
User[] userArray = new User[]{
new User("张三", 20),
new User("李四", 25),
new User("王五", 18)
};
List<User> sortedUsers = Arrays.stream(userArray)
.sorted(Comparator.comparingInt(User::getAge))
.collect(Collectors.toList());
sortedUsers.forEach(user -> System.out.println(user.getName() + ":" + user.getAge()));
}
}
使用注意事项
- 流是一次性的,同一个流对象只能执行一次终止操作,再次使用会抛出
IllegalStateException,如果需要多次处理,需要重新创建流。 - 处理对象数组时要注意空元素,如果数组中存在
null,直接调用对象的方法会抛出空指针异常,建议先过滤掉null元素:filter(Objects::nonNull)。 - 基本类型数组和对象数组的处理方式不同,基本类型数组使用
Arrays.stream()会得到对应的IntStream、LongStream等,不需要装箱操作,效率更高。 - 流操作是惰性的,中间操作不会立即执行,只有遇到终止操作才会触发整个流的处理链,这一点在调试时需要注意。
JavaStream_API对象数组流操作修改时间:2026-07-11 18:24:14