当前位置: 首页 > news >正文

Java新特性Stream流详解

一、概述

Stream流是Java 8
API添加的一个新的抽象,以一种声明性方式处理数据集合(侧重对于源数据计算能力的封装,并且支持序列与并行两种操作方式)。

Stream流是对集合(Collection)对象功能的增强,与Lambda表达式结合,可以提高编程效率、间接性和程序可读性。

二、如何使用Stream流?
1.创建Stream流。
(1)Stream创建。

Stream<String> stream1 = Stream.of("one","two");

(2) Collection集合创建。

List<String> list = Arrays.asList("one","two");
Stream<String> stream = list.stream(); // 串行Stream
Stream<String> parallelStream = list.parallelStream(); // 并行Stream

(3)Array数组创建

String[] strArr = {"one","two"};Stream arrayStream = Arrays.stream(strArr);

(4) 文件创建

try {Stream<String> fileStream = Files.lines(Paths.get("file.txt"), Charset.defaultCharset());} catch (IOException e) {e.printStackTrace();}

(5) 函数创建
generator:


Stream<String> stream = Stream.generate(()->"a").limit(2);

generate方法接受一个参数,方法参数类型为Supplier ,由它为流提供值。generate生成的流也是无限流,因此通过limit对流进行了截断。

iterator:

Stream<Integer> iterateStream = Stream.iterate(0, s -> s + 2).limit(3);

iterate方法接受两个参数,第一个为初始化值,第二个为进行的函数操作,因为iterator生成的流为无限流,通过limit方法对流进行了截断,只生成3个偶数。

2.操作Stream。
常用的Stream操作包括:过滤、映射、排序、去重、计数、归约等等。
filter:
过滤方法filter用于对Stream中的元素进行筛选,只保留符合指定条件的元素,如下:

List<String> list = Arrays.asList("one","two","three");
Stream<String> stream = list.stream().filter(s -> s.length() > 3);

map:使用map方法可以将流中的元素映射到另一个值。例如,将一个字符串列表中的元素转换为大写:

List<String> names = Arrays.asList("one","two","three");
List<String> upperCaseNames = names.stream().map(String::toUpperCase).collect(Collectors.toList());

sorted:使用sorted方法可以对流中的元素进行排序。例如,对一个整数列表进行升序排序:

List<Integer> numbers = Arrays.asList(1, 3, 5, 1, 7);
List<Integer> sortedNumbers = numbers.stream().sorted().collect(Collectors.toList());

distinct: distinct用于将Stream中的重复元素去除,只保留一个:

List<Integer> numbers = Arrays.asList(2, 7, 1, 1, 7);
List<Integer> sortedNumbers = numbers.stream().distinct().collect(Collectors.toList());

count: 计数方法count用于返回Stream中元素的数量,返回值为long类型。

List<String> list = Arrays.asList("one","two","three");
long count = list.stream().count();

reduce: reduce用于将Stream中的元素归约成一个值,例如求和、求最大值等。例如,计算一个整数列表的总和:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream().reduce(0, Integer::sum);

forEach: forEach方法用于对Stream中的每个元素执行指定的操作。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
list.stream().forEach(System.out::println);

collect:使用collect方法可以将流中的元素收集到一个集合中。例如,将一个字符串列表中的元素收集到一个新的列表中:

List<String> names = Arrays.asList("one","two","three");
List<String> collectedNames = names.stream().collect(Collectors.toList());

总结:
Stream是Java 8中非常重要的一个API,本文详细介绍了Java Stream流的概念、使用方法。通过Stream流,开发人员可以以声明式的方式对数据进行操作,使代码更加简洁、易读。我们还介绍了Stream流的常用操作方法使用
通过充分利用Stream流的特性和优势,开发人员可以编写更加优雅、高效的数据处理代码。

相关文章:

Java新特性Stream流详解

一、概述 Stream流是Java 8 API添加的一个新的抽象&#xff0c;以一种声明性方式处理数据集合&#xff08;侧重对于源数据计算能力的封装&#xff0c;并且支持序列与并行两种操作方式&#xff09;。 Stream流是对集合&#xff08;Collection&#xff09;对象功能的增强&#xf…...

关于VScode中一些常用的快捷操作!

vscode CTRLO&#xff1a;打开文件夹以开始工作 先CTRLK 再CTRLO&#xff1a;打开文件夹以开始工作 如何选择workspace&#xff1a;file → open folder→选目标文件夹【当前工作区选择会影响代码是否能运行】 如何打开终端&#xff1a;View → terminal debug看不到变化历史&…...

Django 使用Mysql数据库

目录 Django 使用Mysql数据库本地安装Mysql数据服务安装好Pymysql服务Django配置数据库迁移各种报错无法找到mysqlclient数据库拒绝连接 Django 使用Mysql数据库 本地安装Mysql数据服务 安装好Pymysql服务 python3 -m pip install PyMySQL官方文档介绍 Django配置 官网文档 …...

js继承的几种方式(原型链继承、构造函数继承、组合式继承、寄生组合式继承、ES6的Class类继承)

1.原型链继承 实现原理&#xff1a;子类的原型指向父类实例。子类在自身实例上找不到属性和方法时去它父类实例&#xff08;父类实例和实例的原型对象&#xff09;上查找&#xff0c;从而实现对父类属性和方法的继承 缺点&#xff1a; 子类创建时不能传参&#xff08;即没有…...

AnyTransition/过渡动画, MatchedGeometryEffect/匹配几何动画效果 的使用

1. AnyTransition 过渡动画效果 1.1 创建过度动画案例 AnyTransitionBootcamp.swift import SwiftUI/// 旋转修饰 View struct RotateViewModifier :ViewModifier{let rotation: Doublefunc body(content: Content) -> some View {content.rotationEffect(Angle(degrees: r…...

mac版postman升级后数据恢复办法

postman升级了一下&#xff0c;所有的collections都丢失了。 首先在finder里找到这个路径 /Users/{用户名}/Library/Application Support/Postman找到升级之前的的最新的backup.json&#xff0c;然后在postman里import这个文件。 所有升级前的collections都恢复了&#xff0…...

四.镜头知识之放大倍率

四.镜头知识之放大倍率 文章目录 四.镜头知识之放大倍率4.0 前言4.1 镜头的光学放大倍率的计算方法4.2 显示器的电子放大倍率4.2.1 智能硬件产品的显示放大倍率计算案例4.3 系统放大倍率4.4 智能硬件产品的系统放大倍率计算案例4.4 智能硬件产品的系统放大倍率计算案例4.0 前言…...

Jenkins UI 自动化持续化集成测试

一&#xff1a;安装jenkins 环境 在官网下载msi 直接安装即可 二&#xff1a;设置全局变量 设置allure 路径 三&#xff1a;创建项目 1、创建自由风格项目 2、如果项目在本地&#xff0c;且本地服务器是windows &#xff0c;找到Jenkins安装根目录&#xff0c;寻找config…...

vue项目中引入地图的详细教程

第一步&#xff1a;在项目中安装地图插件 npm i amap/amap-jsapi-loader --save 第二步&#xff1a;创建一个容器 添加id属性 &#xff08;因为地图必须使用id 不能使用class&#xff09; <div id"maps"></div> 第三步&#xff1a;给这个容器设置宽…...

MyBatisPlus 多数据源配置

目录 一、mybatis-plus 简介 特性 二、支持数据库&#xff1a; 三、 开发实例 1. 引入依赖&#xff1a; 2. 参数配置application.yml 3. 在 Spring Boot 启动类中添加 MapperScan 注解&#xff0c;扫描 Mapper 文件夹&#xff1a; 4. 编写实体类 User.java&#xff08;此处…...

使用Golang实现HTTP代理突破IP访问限制

引言 在当今互联网时代&#xff0c;网站和服务商为了维护安全性和保护用户隐私&#xff0c;常常会对特定的IP地址进行封锁或限制。但是&#xff0c;有时候我们可能需要访问这些被限制的网站或服务。为了突破这种限制&#xff0c;我们可以使用HTTP代理来隐藏真实的客户端IP地址…...

Iterator和ListIterator的区别是什么?

Iterator 和 ListIterator 都是 Java 集合框架中的迭代器,其中 Iterator 是普遍适用于所有实现了 Iterable 接口的集合类的通用迭代器,而 ListIterator 则是专门用于遍历 List 集合的迭代器,它比 Iterator 更加强大,而且只适用于 List 集合。 以下是 Iterator 和 ListItera…...

大坑-MATLAB图片转存时需注意的点

MATLAB中图片的保存和转存有一个巨大的陷阱&#xff0c;我也是在吃了大亏后发现的&#xff0c;正常情况下&#xff0c;MATLAB跑完实验&#xff0c;生成的图片如下 放大后这样 可以方便修改坐标轴标题&#xff0c;最初我就是因为想修改坐标轴标题才给它放大的&#xff0c;因为…...

基于Lang-Chain(ChatGLM和ChatChat)知识库大语言模型的部署搭建

环境准备 阿里云个人认证后&#xff0c;可免费试用机器学习平台PAI&#xff0c;可提供适合大语言模型环境搭建的高配置服务器。 点击试用阿里云服务器 试用产品选择&#xff1a;选择交互式建模PAI-DSW 适合哪些场景 文章/知识库/帮助文档等的检索基于现有知识库实现问答… …...

个人轻博客PHP开源系统/溯雪Sxlog轻博客源码/洁干净轻/占内存极低/php源码

源码简介&#xff1a; 溯雪(sxlog)它是一款很简洁越低内存的轻博客程序&#xff0c;整个程序包不到200KB&#xff0c;占内存极小&#xff0c;比一张照片都要小很多。简洁高效&#xff0c;占用空间内存极小&#xff0c;而且它不依赖任何数据库&#xff0c;不依赖富文本编辑器&a…...

2.Vue-从零开始搭建一个vue项目

题记 从零开始搭建一个vue项目&#xff0c;以下是操作的全过程。 安装Vue CLI脚手架 打开终端&#xff0c;运行以下命令全局安装Vue CLI脚手架&#xff1a; npm install -g vue/cli 查看 Vue CLI脚手架版本&#xff1a; vue -V 注意&#xff1a;查看vue版本的命令不是vue -V&a…...

快速构建代理应对

今天我要和大家分享一个解决反爬策略升级问题的方法&#xff0c;那就是快速构建代理池。如果您是一位爬虫开发人员&#xff0c;一定深知反爬策略的烦恼。但是&#xff0c;通过构建代理池&#xff0c;您可以轻松地应对反爬策略的升级&#xff0c;让您的爬虫持续高效运行。接下来…...

【LeetCode刷题(数据结构)】:另一颗树的子树

给你两棵二叉树 root 和 subRoot 检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子…...

LeetCode 2903. 找出满足差值条件的下标 I【双指针+维护最大最小】简单

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

【神经网络】如何在Pytorch中从零开始将MNIST网络量化为8位

论文&#xff1a; Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference 下载地址&#xff1a;https://arxiv.org/pdf/1712.05877.pdf 更新:量化感知训练的博客文章是在线的&#xff0c;并在这里链接&#xff0c;通过它我们可以训…...

临近起飞,在哪个平台更容易捡漏特价机票?2026年实测指南

“机票越临近起飞越便宜”——这个说法你一定听过。每逢假期临近&#xff0c;总有人在社交媒体上分享自己“起飞前两小时抢到白菜价机票”的神奇经历。但当你真的想在清明、五一出行前“赌一把”时&#xff0c;往往发现价格不仅没降&#xff0c;反而翻倍了。那么问题来了&#…...

深度学习模型压缩:从原理到实践

深度学习模型压缩&#xff1a;从原理到实践 1. 背景与动机 深度学习模型在各种任务上取得了显著的性能提升&#xff0c;但随之而来的是模型规模的不断增长。大型模型虽然性能优异&#xff0c;但也带来了以下问题&#xff1a; 存储需求大&#xff1a;大型模型需要大量存储空间&a…...

你的爬虫被识别了?可能是浏览器指纹惹的祸!教你用Playwright伪装Canvas/WebGL指纹

浏览器指纹识别&#xff1a;爬虫工程师的终极伪装术 当你的爬虫程序已经完美解决了User-Agent轮换、IP代理池和请求频率控制&#xff0c;却依然被目标网站精准识别并封禁时&#xff0c;你可能正面临着现代反爬技术的终极挑战——浏览器指纹识别。这种技术不依赖于传统的请求特征…...

Node RED实战:5分钟搞定MQTT消息发布与订阅(附EMQX配置)

Node RED与MQTT实战&#xff1a;从零构建物联网消息系统 1. 为什么选择Node RED与MQTT组合&#xff1f; 物联网开发领域一直存在一个核心挑战&#xff1a;如何快速搭建可靠的消息通信系统而不陷入底层协议实现的泥潭。这正是Node RED与MQTT这对黄金组合的价值所在——它们让开发…...

QMK Toolbox:机械键盘固件定制与刷写全攻略

QMK Toolbox&#xff1a;机械键盘固件定制与刷写全攻略 【免费下载链接】qmk_toolbox A Toolbox companion for QMK Firmware 项目地址: https://gitcode.com/gh_mirrors/qm/qmk_toolbox 一、核心价值&#xff1a;重新定义键盘控制自由 QMK Toolbox 作为开源硬件领域的…...

复古RPG风AI工坊落地案例:Pixel Fashion Atelier在独立游戏美术中的应用

复古RPG风AI工坊落地案例&#xff1a;Pixel Fashion Atelier在独立游戏美术中的应用 1. 项目概述 **像素时装锻造坊(Pixel Fashion Atelier)**是一款专为独立游戏开发者设计的AI图像生成工具&#xff0c;它巧妙地将复古RPG界面与现代AI技术相结合&#xff0c;为游戏美术创作带…...

ICML 2026 开分!投稿群来了!还有IJCAI、CVPR 2026投稿群!

点击下方卡片&#xff0c;关注“CVer”公众号AI/CV重磅干货&#xff0c;第一时间送达点击进入—>【顶会/顶刊】投稿交流群添加微信&#xff1a;CVer2233&#xff0c;助手会拉你进群&#xff01;扫描下方二维码&#xff0c;加入CVer学术星球&#xff01;可获得最新顶会/顶刊上…...

PasteMD真实案例分享:从零散笔记到结构化学习计划的全过程

PasteMD真实案例分享&#xff1a;从零散笔记到结构化学习计划的全过程 1. 引言&#xff1a;当杂乱笔记遇上智能格式化 你是否经历过这样的困境&#xff1f;电脑桌面上散落着十几个临时创建的记事本文件&#xff0c;手机备忘录里堆满了未经整理的零散想法&#xff0c;会议录音…...

FireRed-OCR保姆级教程:一键部署,精准提取表格公式转Markdown

FireRed-OCR保姆级教程&#xff1a;一键部署&#xff0c;精准提取表格公式转Markdown 1. 引言&#xff1a;为什么选择FireRed-OCR&#xff1f; 在日常工作和学习中&#xff0c;我们经常遇到需要从PDF、图片等文档中提取表格、公式等内容的情况。传统OCR工具往往难以准确识别复…...

UE5 Widget Blueprint实战:5分钟搞定动态血量条与得分系统(附完整蓝图代码)

UE5 Widget Blueprint实战&#xff1a;5分钟搞定动态血量条与得分系统&#xff08;附完整蓝图代码&#xff09; 在独立游戏开发中&#xff0c;UI系统往往是决定玩家体验的关键因素之一。想象一下&#xff1a;当玩家在激烈的战斗中无法快速获取角色状态&#xff0c;或是完成成就…...