javaSE 集合框架(五)——java 8新品Stream类

什么是Stream类?

Stream是Java 8引入的新API,用于处理集合数据的函数式操作。

我们经常需要对集合数据进行各种操作,比如过滤、排序等。然而数组有自己的Arrays类方法(比如sort() swap()),集合类有Collcetion接口的通用方法(比如add() size() addAll()等)也有Collections的静态方法(比如max(Collection) sort(List)等),为什么还要搞一个Stream呢?

那肯定就是解决前者的痛点问题咯!

我们始终以这个场景为例:

假设我们有一个海量整数列表,我们需要找出其中大于10的偶数。

痛点问题(一)命令式编程读起来头痛

命令式编程是什么?想想你每次写冒泡排序、选择排序的时候,都要痛苦的思考两层循环怎么写(初始下标是什么?结束判断是什么?),那就是命令式编程。

java 复制代码
// 传统:需要关注循环变量、条件判断、临时集合
List<Integer> evens = new ArrayList<>();
for (Integer num : numbers) {
    if (num % 2 == 0) {
        evens.add(num);
    }
}

而Stream采用链式编程、声明式编程,清晰易读。链式编程很好理解,在C++里就有这个概念了,最初被称为"语法糖",从"语法糖"这个名字我们就能看出来,开发者喜欢这种编程方式。那什么是生命式编程呢? 就像AI Agent一样,你只需要告诉他"要做什么",不需要告诉他"怎么去做",他自己会做。

java 复制代码
// Stream:关注业务逻辑本身
List<Integer> evens = numbers.stream()
    .filter(n -> n % 2 == 0)
    .collect(Collectors.toList());

痛点问题(二)循环嵌套太深

痛点问题(三)所有数据都要遍历一遍

也就是说"海量数据的情况,collection和数组处理起来要for循环遍历海量数据。"

那Stream底层又是如何实现的"找到5个就停止了呢"

痛点问题(四)多线程写起来复杂,且容易遗漏线程安全的处理

我们有的朋友就因为写多线程没有注意线程安全的问题,在大厂的试用期被leader质疑了呢,如果他用Stream就不用处理了呢。

java 复制代码
// 传统并行处理:复杂且容易出错
List<Integer> numbers = // ... 大数据集
List<Integer> result = Collections.synchronizedList(new ArrayList<>());

// 需要手动管理线程池、任务分发、同步
ExecutorService executor = Executors.newFixedThreadPool(4);
for (Integer num : numbers) {
    executor.submit(() -> {
        if (num % 2 == 0) {
            synchronized(result) {
                result.add(num);
            }
        }
    });
}

而用Stream,只需要一行代码实现并行

java 复制代码
// Stream:一行代码实现并行
List<Integer> result = numbers.parallelStream()
    .filter(n -> n % 2 == 0)
    .collect(Collectors.toList());
相关推荐
坐吃山猪2 分钟前
【多线程】Semaphore使用
java·数据库·oracle·多线程
传奇开心果编程10 分钟前
【Rust入门知识点学与练】第3课:String 与 &str 的区别
开发语言·学习·rust
秋名RG21 分钟前
Java 核心特性一览
java·开发语言
霸道流氓气质26 分钟前
Spring AI 技术细节:RAG QuestionAnswerAdvisor 设计与实现
java·人工智能·spring
平头哥AI1 小时前
Day 01 | go run 跑通第一个 Go 程序,go build 留下一个能拷走的 exe
开发语言·后端·golang
斑马1391 小时前
Linux软件编程学习笔记(十二)——TCP并发服务器模型
java·服务器·网络
冬栈程序设计1 小时前
Springboot宿舍管理系统【670099】 -附源码(开箱即用)
java·毕业设计·springboot·课程设计·程序设计·大作业
2601_962284501 小时前
北京Java全栈开发培训 Web前端开发 软件测试就业培训班
java·软件测试·web前端·全栈开发·就业培训
葡萄城技术团队1 小时前
工业数据可视化:使用活字格 AIcoding + Three.js 构建轻量化三维设备监控大屏
开发语言·javascript·信息可视化
qiaosaifei2 小时前
JAVA老项目中有大量的类名_编译时报找不到符号错误
java·开发语言