深度解析Java JDK 1.8中Stream流的源码实现:带你探寻数据流的奥秘

news2024/11/16 13:56:22

在这里插入图片描述

文章目录

    • 一、 Stream流概述
      • 1.1 什么是Stream流,以及它的主要特点和优势
      • 1.2 Stream流的基本操作:过滤、映射、排序等
    • 二、 Stream流源码解析
      • 2.1 接口和基本概念
      • 2.2 创建流
      • 2.3 源码分析
        • 2.3.1 流的起始
        • 2.3.2 流的初始
        • 2.3.3 认识BaseStream
        • 2.3.4 Stream接口继承BaseStream
        • 2.3.5 Stream流的其它流形式

一、 Stream流概述

1.1 什么是Stream流,以及它的主要特点和优势

什么是Stream流

jdk1.8中引入的Stream流是一种用函数式编程方式操作集合的新特性,提供了一种更简洁、高效的方式来处理集合数据,可以将集合操作转换为一系列的流水线操作,实现更加优雅和功能强大的数据处理。

主要特点和优势

  1. 链式调用:Stream流支持链式调用,可以将多个操作连接在一起,形成一个流水线式的数据处理过程,使代码更加清晰和易读。
  2. 惰性求值:Stream流采用惰性求值的策略,只有当终端操作被调用时才会执行中间操作,这种特性可以提高性能,避免不必要的计算。
  3. 并行处理:Stream流提供了并行处理的能力,在处理大规模数据时可以自动进行并行计算,充分利用多核处理器的性能优势,提高程序的执行效率。
  4. 函数式编程:Stream流倡导函数式编程思想,可以通过Lambda表达式来定义操作,从而简化代码,减少样板代码的编写。

Stream流的简单Demo

import java.util.Arrays;
import java.util.List;

public class StreamDemo {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        // 使用Stream流对集合元素进行处理
        int sum = numbers.stream()
                .filter(n -> n % 2 == 0) // 过滤偶数  2   4
                .map(n -> n * 2) // 将偶数翻倍  4  8
                .reduce(0, Integer::sum); // 求和   4 + 8 = 12

        System.out.println("处理后的结果:" + sum); // 处理后的结果:12
    }
}

1.2 Stream流的基本操作:过滤、映射、排序等

使用水果的Demo来解释API

import java.util.Arrays;
import java.util.List;

public class StreamFruitsDemo {
    public static void main(String[] args) {
        List<String> fruits = Arrays.asList("Apple", "Banana", "Cherry", "Date", "Elderberry");

        // `过滤`  长度大于5的水果
        System.out.println("过滤后的水果:");
        fruits.stream()
                .filter(fruit -> fruit.length() > 5)
                .forEach(System.out::println); // 循环输出,打印过滤的结果

        // 将水果名称  `转换为大写`
        System.out.println("映射后的水果名称:");
        fruits.stream()
                .map(String::toUpperCase)
                .forEach(System.out::println);

        // 对水果名称进行  `排序`
        System.out.println("按字母顺序排序的水果名称:");
        fruits.stream()
                .sorted()
                .forEach(System.out::println);
        
         // 对水果名称进行   `连接`
         System.out.println("所有水果名称连接后的结果:" );
        fruits.stream()
                .reduce("", (partialResult, fruit) -> partialResult + " " + fruit);
    }
}

ps:其它API可以查询官网等方式来了解,这篇文章就不过多描述其用法了。

二、 Stream流源码解析

2.1 接口和基本概念

Stream 接口

Stream 接口是 jdk1.8 引入的用于支持函数式编程的接口,它提供了一种高效处理集合数据的方式。Stream 接口并不是存储数据的容器,而是用于描述对数据的一系列操作,并且可以进行链式操作。

Spliterator 接口

Spliterator 接口是jdk1.8中引入的,用于支持并行遍历和分割迭代元素的接口。在 Stream 流中,Spliterator 主要用于将数据分割成多个部分,以便并行处理。

Stream接口和 Spliterator接口的Demo:

在这里插入图片描述

2.2 创建流

要查看流的创建方式的实现逻辑,可以从不同的创建方式入手。

建议按照以下顺序来查看源码

  1. 集合创建流(Collection.stream())
    • 可以先从 Collection 接口的 stream() 方法入手,查看其实现逻辑。可以查看 java.util.Collection 接口的源码,找到 stream() 方法的具体实现。
  2. 数组创建流(Arrays.stream())
    • 可以查看 java.util.Arrays 类中的 stream() 方法的实现逻辑,找到数组创建流的具体过程。
  3. 使用静态方法创建流(Stream.of() 等)
    • 对于使用静态方法创建流,比如 Stream.of(),可以直接查看 java.util.stream.Stream 类中的实现逻辑,找到对应的静态方法实现。
  4. 其它流,比如: 调用 parallelStream() 方法创建并发流,默认使用的是 ForkJoinPool.commonPool()线程池。

创建方式

在这里插入图片描述

ps:本文章从 Collection 接口的 stream() 方法入手来解读源码,其它源码读者可以试着去解读。

在这里插入图片描述

2.3 源码分析

源码解析都是写在图上,不做过多的描述。

2.3.1 流的起始

在这里插入图片描述

2.3.2 流的初始

在这里插入图片描述

2.3.3 认识BaseStream

在这里插入图片描述

2.3.4 Stream接口继承BaseStream

在这里插入图片描述

2.3.5 Stream流的其它流形式

在这里插入图片描述

到了Stream接口,懂的都懂了吧,中间操作和终端操作等解析,请期待下篇文章哈哈哈哈哈,晚安玛卡巴卡+__+

你只管努力,剩下的交给时间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1517934.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软考高级:软件工程单元测试(驱动模块、被测模块、桩模块)概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

Qt 线程池 QThreadPool

一.Qt 线程池 QThreadPool介绍 Qt线程池是一种管理多个线程的并发编程模型&#xff0c;通过使用线程池可以提高性能、控制并发度、提供任务队列和简化线程管理。 在Qt中&#xff0c;线程池的使用主要涉及以下几个步骤&#xff1a; 创建任务类&#xff1a;需要定义一个任务类&am…

【计算机视觉】一、计算机视觉概述

文章目录 一、计算机视觉二、计算机视觉与其它学科领域的关系1、图像处理2、计算机图形学3、模式识别4、人工智能&#xff08;AI&#xff09;5、神经生理学与认知科学 三、计算机视觉的应用1. 人脸识别2. 目标检测3. 图像生成4. 城市建模5. 电影特效6. 体感游戏动作捕捉7. 虚拟…

Android 仿天通卫星对准(卫星在圆形卫星轨道上转动)效果实现

效果图 View源码 package com.android.circlescalebar.view;import android.animation.ObjectAnimator; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics…

linux对于文件操作其他命令

tac&#xff0c;与cat不同&#xff0c;tac可以倒序查看文件内容 管道符&#xff0c;可以将第一条命令的结果当作第二条命令的输入 more分屏显示文件内容 head&#xff0c;可以查看文件前多少行&#xff0c;tail可以查看文件后多少行

JavaEE之多线程(创建线程的五种写法)详解

&#x1f63d;博主CSDN主页: 小源_&#x1f63d; &#x1f58b;️个人专栏: JavaEE &#x1f600;努力追逐大佬们的步伐~ 目录 1. 前言 2. 操作系统"内核" 3. 创建线程的五种写法 (我们重点要掌握最后一种写法!!) 3.1 继承 Thread, 重写 run 3. 2 实现 Runnabl…

SpringBoot Servlet容器启动解析

介绍 容器架构 容器处理请求 容器启动全局流程解析 启动前准备 WebServer创建入口 WebServer创建 Servlet启动 Web容器工厂类加载解析 Web容器个性化配置 属性注入 工厂类初始化 BeanPostProcessor方法实现 定制化流程 面试题 请描述下Servlet容器启动流程&#xff1f;介绍下…

最新android icon和splashScreen适配兼容至2024android

android在12做了splashScreen的变动&#xff0c;即&#xff0c;android12有自带的screenSplash过渡&#xff0c;不论你是否自己有变化&#xff0c;都会插入该动画。 android8做了icon的巨大变动。13做了图标的主题兼容。 一、icon制作 制作 使用android自带的工具&#xff0…

Modbus -tcp协议使用第二版

1.1 协议描述 1.1.1 总体通信结构 MODBUS TCP/IP 的通信系统可以包括不同类型的设备&#xff1a; &#xff08;1&#xff09;连接至 TCP/IP 网络的 MODBUS TCP/IP 客户机和服务器设备&#xff1b; &#xff08;2&#xff09;互连设备&#xff0c;例如&#xff1a;在 TCP/IP…

外包干了5天,技术明显退步。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入南京某软件公司&#xff0c;干了接近2年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了2年的功能测试&…

C# Onnx yolov8 building segmentation

目录 效果 模型信息 项目 代码 下载 C# Onnx yolov8 building segmentation 效果 模型信息 Model Properties ------------------------- date&#xff1a;2023-12-22T10:51:07.627471 author&#xff1a;Ultralytics task&#xff1a;segment license&#xff1a;AGPL-…

HBase分布式数据库的原理和架构

一、HBase简介 HBase是是一个高性能、高可靠性、面向列的分布式数据库&#xff0c;它是为了在廉价的硬件集群上存储大规模数据而设计的。HBase利用Hadoop HDFS作为其文件存储系统&#xff0c;且Hbase是基于Zookeeper的。 二、HBase架构 *图片引用 Hbase采用Master/Slave架构…

YOLOv9(3):YOLOv9损失(Loss)计算

1. 写在前面 YOLOv9的Loss计算与YOLOv8如出一辙&#xff0c;仅存在略微的差异。多说一句&#xff0c;数据的预处理和导入方式都是一样的。因此如果你已经对YOLOv8了解的比较透彻&#xff0c;那么对于YOLOv9你也只是需要多关注网络结构就可以。 YOLOv9本身也是Anchor-Free的&a…

彩虹外链网盘界面UI美化版超级简洁好看

彩虹外链网盘界面UI美化版 彩虹外链网盘&#xff0c;是一款PHP网盘与外链分享程序&#xff0c;支持所有格式文件的上传&#xff0c;可以生成文件外链、图片外链、音乐视频外链&#xff0c;生成外链同时自动生成相应的UBB代码和HTML代码&#xff0c;还可支持文本、图片、音乐、…

机试:成绩排名

问题描述: 代码示例: #include <bits/stdc.h> using namespace std;int main(){cout << "样例输入" << endl; int n;int m;cin >> n;int nums[n];for(int i 0; i < n; i){cin >> nums[i];}// 排序for(int i 0; i < n; i){//…

Leetcode 3.14

Leetcode hot100 二叉树1.二叉树的层序遍历2.验证二叉搜索树3.二叉树的右视图 二叉树 1.二叉树的层序遍历 二叉树的层序遍历 二叉树的层序遍历可以用先进先出的队列来实现。 将每一层的所有node都添加到队列中&#xff0c;记录下当前队列的长度&#xff0c;即该层的元素数量&…

Java操作Sql语句 出现迭代死循环 (Bug排查)

目录 1. 问题所示2. 原理分析3. 解决方法4. 彩蛋1. 问题所示 Java执行Sql语句来查询一些数据的时候 虽说数据量很大,但是查询过程中一直迭代查询 截图如下所示: 2. 原理分析 至于迭代死循环,可能是不满足的条件也进入查询(本身我的数据量就很大) 主要可能引起的两个原…

创新发展,探索智慧园区平台架构设计与实现

随着信息技术的快速发展&#xff0c;智慧园区平台作为集成物联网、大数据、人工智能等技术的综合性服务平台&#xff0c;正逐步成为推动企业数字化转型的重要驱动力。本文将深入探讨智慧园区平台的架构设计思路、关键技术和应用场景&#xff0c;助力读者了解如何打造智慧化、协…

【洛谷 P8637】[蓝桥杯 2016 省 B] 交换瓶子 题解(贪心算法)

[蓝桥杯 2016 省 B] 交换瓶子 题目描述 有 N N N 个瓶子&#xff0c;编号 1 ∼ N 1 \sim N 1∼N&#xff0c;放在架子上。 比如有 5 5 5 个瓶子&#xff1a; 2 , 1 , 3 , 5 , 4 2,1,3,5,4 2,1,3,5,4 要求每次拿起 2 2 2 个瓶子&#xff0c;交换它们的位置。 经过若干次…

linux查看服务器登录成功和登录失败的命令

last 查看成功登录服务器的信息&#xff0c;包括ip&#xff0c;时间&#xff0c;登录用户&#xff0c;时长。lastb 查看登录服务器失败的信息。 last命令实例&#xff1a; 其他参数&#xff1a; -a&#xff1a;把从何处登入系统的主机名称或ip地址&#xff0c;显示在最后一行…