Java中对对象数组使用Stream API的正确方法是什么

来源:站长素材作者:新加坡程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《Java中对对象数组使用Stream API的正确方法是什么》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Java中对对象数组使用Stream API的正确方法是什么》有用,将其分享出去将是对创作者最好的鼓励。

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

Java中对对象数组使用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()会得到对应的IntStreamLongStream等,不需要装箱操作,效率更高。
  • 流操作是惰性的,中间操作不会立即执行,只有遇到终止操作才会触发整个流的处理链,这一点在调试时需要注意。

JavaStream_API对象数组流操作修改时间:2026-07-11 18:24:14

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。