Java的流操作:让数据处理更简单,更高效
Java 8引入了一种新的抽象概念——流(Stream),它允许我们以声明式方式处理数据集合。通过使用流,可以更简洁、更易读地编写代码来对集合进行复杂的操作,如过滤、映射、排序等。本文将介绍Java 8的流操作的基本概念和使用方法。
创建流
要使用流,首先需要创建一个流。流可以从多种数据源创建,如数组、集合、文件等。以下是一些创建流的示例:
// 从数组创建流
int[] numbers = {1, 2, 3, 4, 5};
IntStream intStream = Arrays.stream(numbers);// 从集合创建流
List<String> names = Arrays.asList("张三", "李四", "王五");
Stream<String> nameStream = names.stream();// 从文件创建流
try (Stream<String> lines = Files.lines(Paths.get("example.txt"))) {lines.forEach(line -> {/*TODO:逐行处理文件内容*/ });
} catch (IOException e) {e.printStackTrace();
}
中间操作
中间操作是对流中的元素进行某种处理的操作,例如过滤、映射、排序等。中间操作不会改变流本身,而是返回一个新的流,因此可以通过链式调用方法组合多个中间操作。以下是一些常见的中间操作:
// 过滤元素
IntStream evenNumbers = intStream.filter(n -> n % 2 == 0);// 转换元素
Stream<Integer> evenNumbers1 = evenNumbers.mapToObj(Integer::new);// 映射元素
Stream<String> upperCaseNames = nameStream.map(String::toUpperCase);// 排序元素
Stream<String> sortedNames = nameStream.sorted();
Stream<String> revSortedNames = names.stream().sorted(Comparator.reverseOrder());
终端操作
终端操作是对流进行最终处理的操作,例如计算结果、遍历元素等。终端操作会消耗流,即执行后流将不再可用。以下是一些常见的终端操作:
// 计算结果(如求和、平均值等)
// 注意:实际使用时,一个流只能使用一次,再次使用需要重新生成流,否则会收到下列异常:
// java.lang.IllegalStateException: stream has already been operated upon or closed
double average = intStream.average().orElse(0);
int sum = intStream.sum();
long count = intStream.count();
OptionalInt max = intStream.max();
OptionalInt min = intStream.min();// 遍历输出每个元素
intStream.forEach(System.out::println);// 收集到列表中
List<Integer> numbersList = intStream.collect(Collectors.toList());
并行流
Java 8还提供了并行流(Parallel Stream),它可以充分利用多核处理器的优势,提高处理速度。要创建一个并行流,只需在创建流时调用parallel()方法或者使用parallelStream()创建流即可:
// 创建一个并行流
IntStream parallelIntStream = intStream.parallel();
Arrays.asList("张三", "李四", "王五").parallelStream();
需要注意的是,并非所有情况下都适合使用并行流。在某些情况下,由于线程切换的开销,并行流的性能可能不如串行流。因此,在使用并行流时,需要根据具体情况进行权衡。
示例:产品分组
使用流可以方便地处理数据,如过滤列表中库存大于0的产品,然后按产品类型进行分组。以下为简单的代码示例,其中省去了代码运行非必需的getter()和toString()方法:
public static void main(String[] args) {List<Product> list = new ArrayList(){{add(new Product(1, 1, 0, "prod1"));add(new Product(2, 1, 5, "prod2"));add(new Product(3, 2, 10, "prod3"));add(new Product(4, 2, 11, "prod4"));add(new Product(5, 2, 0, "prod5"));}};Map<Integer, List<Product>> map = list.parallelStream() // 创建并行流.filter(product -> product.getInventory() > 0) // 过滤库存大于0的产品.collect(Collectors.groupingBy(Product::getProductType)); //分组后收集到Map中System.out.println(map);
}public static class Product {int productId;int productType;int inventory;String productName;public int getProductType() {return productType;}public int getInventory() {return inventory;}public Product(int productId, int productType, int inventory, String productName) {this.productId = productId;this.productType = productType;this.inventory = inventory;this.productName = productName;}
}
总结
Java 8的流操作带来了数据处理的革命性突破,让开发者能够更方便、更简洁地处理数据。通过链式调用方法,开发者能够清晰地表达数据处理逻辑,提高代码的可读性和可维护性。同时,流操作还提供了高性能、类型安全和可扩展性等优势,使得开发者能够根据实际需求灵活地处理数据。
相关文章:
Java的流操作:让数据处理更简单,更高效
Java 8引入了一种新的抽象概念——流(Stream),它允许我们以声明式方式处理数据集合。通过使用流,可以更简洁、更易读地编写代码来对集合进行复杂的操作,如过滤、映射、排序等。本文将介绍Java 8的流操作的基本概念和使…...
3D渲染原理及朴素JavaScript实现【不使用WebGL】
在网页中显示图像和其他平面形状非常容易。 然而,当涉及到显示 3D 形状时,事情就变得不那么容易了,因为 3D 几何比 2D 几何更复杂。 为此,你可以使用专用技术和库,例如 WebGL 和 Three.js。 但是,如果你只…...
解决《荒野大镖客》提示emp.dll文件丢失问题,总结5个修复方法
在当今数字时代,游戏已经成为人们休闲娱乐的重要方式。作为一名游戏爱好者,笔者在近期体验《荒野大镖客》这款游戏时,遇到了一个令人苦恼的问题——emp.dll文件丢失。这个问题让游戏的无法启动进行。本文将围绕这一问题,探讨其原因…...
maven重新加载后Target bytecode version总是变回1.8
现象 Load Maven Changes后 Settings - Build, Execution, Deployment - Java Compiler - Target bytecode version总是变为1.8 Project Structure - Modules - Language level总是变为1.8 解决方法 方法一 pom.xml中包含 <project>[...]<build>[...]<plug…...
react+星火大模型,构建上下文ai问答页面(可扩展)
前言 最近写的开源项目核心功能跑通了,前两天突发奇想。关于项目可否介入大模型来辅助用户使用平台,就跑去研究了最近比较活火的国内大模型–讯飞星火大模型。 大模型api获取 控制台登录 地址:https://console.xfyun.cn/app/myapp 新建应…...
python---设计模式
python中设计模式-单例模式 基于__new__方法实现 第一个设计: class MySingleton:def __init__(self):passdef __new__(cls, *args, **kwargs):passmysingleton1 MySingleton() mysingleton2 MySingleton() print(mysingleton1) print(mysingleton2) print(id(…...
Java编写xml文件时,文件中特殊字符如何解决?
有一个使用Java创建XML文件的需求,但标签里面有以下特殊字符<、>、&等 在未解决之前,创建出的XML是这样的 <?xml version"1.0" encoding"UTF-8"?><actionlist><update><jobno>1111</jobno&…...
vue3 ts pinia openapi vue-query pnpm docker前端架构小记
1.引言 开发中,我们是否经常遇到以下痛点: 项目越大,启动和热更新越来越慢,启动都要花个3-5分钟以上没有类型保障,接口返回的Object不拿到真实数据都不知道有哪些字段,接手别人js项目(无类型)很痛苦需要手…...
ARM day4
LED灯亮灭控制 .text .global _start _start: 1ldr r0,0x50000a28ldr r1,[r0]orr r1,r1,#(0x3<<4)str r1,[r0] 2ldr r0,0x50006000ldr r1,[r0]bic r1,r1,#(0x3<<20)orr r1,r1,#(0x1<<20)bic r1,r1,#(0x3<<16)orr r1,r1,#(0x1<<16)str r1,[r0]…...
3.30每日一题(多元函数微分学)
1、判断连续:再分界点的极限值等于该点的函数值; 如何求极限值: 初步判断:分母都为二次幂开根号,所以分母为一次幂;分子为二次,一般来说整体为0; 如何说明极限为零(常用…...
《OSTEP》条件变量(chap30)
〇、前言 本文是对《OSTEP》第三十章的实践与总结。 一、条件变量 #include <pthread.h> #include <stdio.h> #include <assert.h>int buffer; int count 0; // 资源为空// 生产,在 buffer 中放入一个值 void put(int value) {assert(count 0);count 1…...
MySQL的索引和复合索引
由于MySQL自动将主键加入到二级索引(自行建立的index)里,所以当select的是主键或二级索引就会很快,select *就会慢。因为有些列是没在索引里的 假设CA有1kw人咋整,那我这个索引只起了前一半作用。 所以用复合索引&am…...
关于mac下pycharm旧版本没删除的情况下新版本2023安装之后闪退
先说结论,我用的app cleaner 重新删除的pycharm ,再重新安装即可。在此记录一下 之前安装的旧版的2020的pycharm,因为装不了新的插件,没办法就升级了。新装2023打开之后闪退,重启系统也不行,怀疑是一起破解…...
Django中如何让DRF的接口针对前后台返回不同的字段
在Django中,使用Django Rest Framework(DRF)时,可以通过序列化器(Serializer)和视图(View)的组合来实现前后台返回不同的字段。这通常是因为前后台对数据的需求不同,或者…...
【机器学习】Kmeans聚类算法
一、聚类简介 Clustering (聚类)是常见的unsupervised learning (无监督学习)方法,简单地说就是把相似的数据样本分到一组(簇),聚类的过程,我们并不清楚某一类是什么(通常无标签信息)࿰…...
getid3 获取视频时长
1、首先,我们需要先下载一份PHP类—getid3https://codeload.github.com/JamesHeinrich/getID3/zip/master 2.我在laravel6.0 中使用 需要在composer.json 自动加载 否则系统访问不到 在命令行 执行 composer dump-autoload $getID3 new \getID3();//视频文件需要放…...
如何知道一个程序为哪些信号注册了哪些信号处理函数?
https://unix.stackexchange.com/questions/379694/is-there-a-way-to-know-if-signals-are-present-in-your-application-and-which-sign 使用 strace...
34 mysql limit 的实现
前言 这里来看一下 我们常见的 mysql 分页的 limit 的相的处理 这个问题的主要是来自于 之前有一个需要处理 大数据量的数据表的信息, 将数据转移到 es 中 然后就是用了最简单的 “select * from tz_test limit $pageOffset, $pageSize ” 来分页处理 但是由于 数据表的数…...
jbase实现申明式事务
对有反射的语言,申明式事务肯定不可少。没必要没个人都try,catch写事务,写的不好的话还经常容易锁表,为此给框架引入申明式事务。申明式既字面意思,在需要事务的方法前面加一个申明,那么框架保证事务。 首…...
如何在在线Excel文档中规范单元格输入
在日常的工作中,我们常常需要处理大量的数据。为了确保数据的准确性和可靠性。我们需要对输入的数据进行规范化和验证。其中一个重要的方面是规范单元格输入。而数据验证作为Excel中一种非常实用的功能,它可以帮助用户规范单元格的输入,从而提…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
