Stream API

        Stream 是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。

        Stream 和 Collection 集合的区别:Collection 是一种静态的内存数据结构, 讲的是数据,而 Stream 是有关计算的,讲的是计算。前者是主要面向内存, 存储在内存中,后者主要是面向 CPU,通过 CPU 实现计算。

  • Stream 自己不会存储元素。
  • Stream 不会改变源对象。相反,他们会返回一个持有结果的新 Stream。
  • Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。即一旦执行终止操作,就执行中间操作链,并产生结果。
  • Stream 一旦执行了终止操作,就不能再调用其它中间操作或终止操作了。

Stream 的操作三个步骤

1- 创建 Stream:一个数据源(如:集合、数组),获取一个流

Integer[] nums = {11, 2, 4, 7, 0, 1, 1, 7};

// 方式一:通过集合
List<Integer> list = Arrays.asList(nums);
// 顺序流
Stream<Integer> stream = list.stream();
// 并行流
Stream<Integer> stream1 = list.parallelStream();

// 方式二:通过数组
Stream<Integer> stream2 = Arrays.stream(nums);

// 方式三:通过Stream的of()
Stream<String> stream3 = Stream.of("A", "B", "D", "C");

2- 中间操作:每次处理都会返回一个持有结果的新 Stream,即中间操作的方法 返回值仍然是 Stream 类型的对象。因此中间操作可以是个操作链,可对数据源的数据进行 n 次处理,但是在终结操作前,并不会真正执行。

        // 筛选与切片
        // filter() 过滤
        stream.filter(num -> num > 3).forEach(System.out :: println);   // 11, 4, 7, 7
        System.out.println();
        // limit() 截断,使元素不超过给定数量
        // stream.limit(2).forEach(System.out :: println); // 错误,上一行forEach已将stream终止
        list.stream().filter(num -> num > 3).limit(2).forEach(System.out :: println);   // 11, 4
        System.out.println();
        // skip() 跳过前n个元素,若流中元素不足n,返回一个空流
        list.stream().skip(2).forEach(System.out :: println);   // 4, 7, 0, 1, 1, 7
        System.out.println();
        // distinct() 筛选,通过流所生成元素的 hashCode() 和 equals() 去除重复元素
        list.stream().distinct().forEach(System.out :: println);    // 11, 2, 4, 7, 0, 1
        System.out.println();

        // 映射
        // map(Function f) 接收一个函数作为参数,将元素转换成其他形式或提取信息,
        // 该函数会被应用到每个元素上,并将其映射成一个新的元素
        stream3.map(String :: toLowerCase).forEach(System.out :: println); // a, b, d, c
        System.out.println();

        // 排序
        // 自然排序
        list.stream().sorted().forEach(System.out :: println); // 0, 1, 1, 2, 4, 7, 7, 11
        System.out.println();
        // 定制排序
        list.stream().sorted((o1, o2) -> o2 - o1).forEach(System.out :: println); // 11, 7, 7, 4, 2, 1, 1, 0

3- 终止操作(终端操作):终止操作的方法返回值类型就不再是 Stream 了,因此 一旦执行终止操作,就结束整个 Stream 操作了。一旦执行终止操作,就执行中间操作链,最终产生结果并结束 Stream。

        // 匹配与查找
        // allMatch(Predicate p) 检查是否匹配所有元素
        boolean a1 = list.stream().allMatch(num -> num > 0);
        System.out.println(a1); // false
        // anyMatch(Predicate p) 检查是否匹配至少一个元素
        a1 = list.stream().anyMatch(num -> num > 0);
        System.out.println(a1); // true
        // findFirst() 返回第一个元素
        System.out.println(list.stream().findFirst()); // Optional[11]
        System.out.println(list.stream().findFirst().get());    // 11
        // count 返回流中的总个数
        System.out.println(list.stream().count()); // 8
        // max(Comparator c) 返回流中最大值(排序完最右边的值)
        System.out.println(list.stream().max((o1, o2) -> o1 - o2)); // Optional[11]
        System.out.println(list.stream().max((o1, o2) -> o2 - o1)); // Optional[0]
        // min(Comparator c) 返回流中最小值
        System.out.println(list.stream().min((o1, o2) -> o1 - o2)); // Optional[0]
        System.out.println(list.stream().min((o1, o2) -> o2 - o1)); // Optional[11]
        // forEach(Consumer c) 内部迭代
        list.stream().forEach(System.out :: println); // 11, 2, 4, 7, 0, 1, 1, 7

        // 归约
        // reduce(T identity, BinaryOperator b) 可以将流中元素反复结合起来,得到一个值。返回 T 
        System.out.println(list.stream().reduce(0, (o1, o2) -> o1 + o2));   // list中数的和,identity为初始值 33
        
        // 收集
        // collect(Collector c) 将流转换为其他形式。接收一个 Collector 接口的实现,用于给 Stream 中元素做汇总的方法
        List<Integer> list2 = list.stream().collect(Collectors.toList());
        System.out.println(list2);  // [11, 2, 4, 7, 0, 1, 1, 7]
        Set<Integer> set = list.stream().collect(Collectors.toSet());
        System.out.println(set);    // [0, 1, 2, 4, 7, 11]
        // toCollection Collector<T, ?, C> 把流中元素收集到创建的集合 
        Collection<Integer> co = list.stream().collect(Collectors.toCollection(ArrayList::new));
        System.out.println(co); // [11, 2, 4, 7, 0, 1, 1, 7]
        // counting Collector<T, ?, Long> 计算流中元素的个数
        System.out.println(list.stream().collect(Collectors.counting()));   // 8
        // summingInt Collector<T, ?, Integer> 对流中元素的整数属性求和 
        // averagingInt Collector<T, ?, Double> 计算流中元素 Integer 属性的平均值
        // summarizingInt Collector<T, ?, IntSummaryStatistics> 收集流中 Integer 属性的统计值。如:平均值 
        // joining Collector<CharSequence, ?, String> 连接流中每个字符串
        // maxBy Collector<T, ?, Optional> 根据比较器选择最大值 
        // minBy Collector<T, ?, Optional> 根据比较器选择最小值 
        // reducing Collector<T, ?, Optional> 从一个作为累加器的初始值开始,利用BinaryOperator 与流中元素逐个结合,从而归约成单个值 
        // collectingAndThen Collector<T,A,RR> 包裹另一个收集器,对其结果转换函数 
        // groupingBy Collector<T, ?, Map<K, List>> 根据某属性值对流分组,属性为K,结果为 V 
        // partitioningBy Collector<T, ?, Map<Boolean, List>> 根据 true 或 false 进行分区 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小林coding图解计算机网络|基础篇02|键入网址到网页显示,期间发生了什么?

小林coding网站通道&#xff1a;入口 本篇文章摘抄应付面试的重点内容&#xff0c;详细内容还请移步&#xff1a;小林coding网站通道 文章目录 孤单小弟——HTTP真实地址查询——DNS指南好帮手——协议栈可靠传输——TCP远程定位——IP两点传输——MAC出口——网卡送别者——交…

Linux是什么,该如何学习

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Linux的起源与发展 2、Linux在现代计算机领域…

Gatekeep AI:文本转视频教学工具,开启智能学习新纪元

在当今的数字时代,技术的进步不断改变着我们学习和理解知识的方式。 Gatekeep AI 就是这样一款令人兴奋的工具,它专注于将数学和物理问题通过文本提示转化为生动的视频。 特点与优势: 直观的可视化:将复杂的数学和物理概念以直观的视频形式呈现。快速生成:根据用户提供的…

SpringBoot + Vue + Nginx前后端分离项目本地部署(Win)

SpringBoot Vue Nginx前后端分离项目本地部署步骤 本地部署所需步骤 将后端打包好的jar文件和前端生成的静态资源文件放入同一目录启动Spring Boot应用配置Nginx并重启访问 http://your_domain 查看部署效果 前端Vue项目部署 将写好的vue代码的目录下运行 npm run build …

arm裸机(1)、点灯|按键

芯片是S3C2440 首先看原理图&#xff0c;led_1234分别对应引脚GPB 5678 设置引脚为输出 向寄存器相应位写入 #define GPBCON (*(volatile unsigned long *)0x56000010) //p5 6 7 8 void led_init(void) {GPBCON & ~(0x3 << 10);GPBCON | (0x1 <<…

网络编程(TCP、UDP)

文章目录 一、概念1.1 什么是网络编程1.2 网络编程中的基本知识 二、Socket套接字2.1 概念及分类2.2 TCP VS UDP2.3 通信模型2.4 接口方法UDP数据报套接字编程TCP流套接字编程 三、代码示例3.1 注意点3.2 回显服务器基于UDP基于TCP 一、概念 首先介绍了什么是网络编程&#xff…

【C语言】_文件内容操作:顺序读写

目录 常用函数 1. 字符输入、输出函数 2. 文本行输入、输出函数 3. 格式化输入、输出函数 4. 二进制输入、输出函数 常用函数 功能函数名适用于字符输入函数fgetc所有输入流字符输出函数fputc所有输出流文本行输入函数fgets所有输入流文本行输出函数fputs所有输出流格式化…

材料物理 笔记-4

原内容请参考哈尔滨工业大学何飞教授&#xff1a;https://www.bilibili.com/video/BV18b4y1Y7wd/?p12&spm_id_frompageDriver&vd_source61654d4a6e8d7941436149dd99026962 或《材料物理性能及其在材料研究中的应用》&#xff08;哈尔滨工业大学出版社&#xff09; 离…

基于springboot+vue+Mysql的招生管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

RAID 0阵列扩容后的磁盘扩展操作

正文共&#xff1a;777 字 21 图&#xff0c;预估阅读时间&#xff1a;1 分钟 上次操作RAID 0的扩容&#xff08;如何操作RAID 0阵列的扩容&#xff1f;&#xff09;&#xff0c;因为耗时太长进度没有变化&#xff0c;就没再管它了。后来发现&#xff0c;右上角有一个“重新扫描…

Prometheus+grafana环境搭建方法及流程两种方式(docker和源码包)(一)

1.选型对比 最近项目上有对项目服务及中间件的监控需求&#xff0c;要做实现方案调研&#xff0c;总结一下自己的成果&#xff0c;目前业界主流可选的方案有&#xff1a; 国外开源&#xff1a; Prometheus&#xff1a;Prometheus - Monitoring system & time series dat…

C++——模板初阶

泛型编程 C语言中交换两个变量数据的内容一般是这样实现的 #include<iostream>using namespace std;void swap(int* x, int* y) {int tmp *x;*x *y;*y tmp; } int main() {int x 5;int y 7;swap(&x,&y);cout << "x" << x << …

基于栈结构的非递归二叉树结点关键字输出算法

基于栈结构的非递归二叉树结点关键字输出算法 一、引言二、二叉树基本概念三、非递归遍历算法基础四、算法设计五、算法实现六、C代码示例七、算法分析八、优化与讨论 一、引言 在计算机科学中&#xff0c;二叉树是一种重要的数据结构&#xff0c;它广泛应用于各种算法和数据结…

基于深度学习的条形码二维码检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要&#xff1a;本文深入研究了基于YOLOv8/v7/v6/v5的条形码二维码检测系统。核心采用YOLOv8并整合了YOLOv7、YOLOv6、YOLOv5算法&#xff0c;进行性能指标对比&#xff1b;详述了国内外研究现状、数据集处理、算法原理、模型构建与训练代码&#xff0c;及基于Streamlit的交互…

前端优化gzip

gzip是GNUzip的缩写&#xff0c;是一种文件的压缩格式&#xff08;也可以说是若干种文件压缩程序&#xff09;&#xff0c;类似的压缩格式还有compress&#xff08;webpack&#xff09;&#xff0c;deflate等 主要用于组件的压缩 压缩的话主要分为两种&#xff0c; 服务器在…

记事本打开时总是会自动打开之前打开过的文件

记事本打开文件总是会自动打开之前打开过的文件_win11记事本关闭之后打开上一个还在-CSDN博客 感谢该博主&#xff0c;我一直以为是自己电脑的问题&#xff0c;不知道为什么要这么更新&#xff0c;影响我的很多文本内容消失。

我的领导马斯克:痛恨开会,不要非技术中层,推崇裁员

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 马斯克称得上是个“魔鬼老板”这事儿&#xff0c;已经出了名了。 现在&#xff0c;他的老部…

【面试八股总结】进程(一)

参考资料 &#xff1a;小林Coding、阿秀、代码随想录 一、什么是进程&#xff1f; 1. 基本概念 进程是具有独立功能的程序在一个数据集合上运行的过程&#xff0c;是系统进行资源分配和调度的一个独立单位。 2. 进程控制块 系统通过进程控制块PCB描述进程的进本情况…

leetcode代码记录(打家劫舍 II

目录 1. 题目&#xff1a;2. 我的代码&#xff1a;小结&#xff1a; 1. 题目&#xff1a; 一个专业的小偷&#xff0c;计划偷窃一个环形街道上沿街的房屋&#xff0c;每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 &#xff0c;这意味着第一个房屋和最后一个房屋是…

基于小程序实现的校园二手物品交易系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…