Java 8中使用Stream来操作集合
Java 8中使用Stream来操作集合
在Java 8中,你可以使用Stream API来操作集合,这使得集合的处理变得更加简洁和函数式。Stream API提供了一系列的中间操作(intermediate operations)和终端操作(terminal operations),可以很容易地对集合进行过滤、映射、排序、聚合等操作。
下面是一些使用Stream API操作集合的例子:
1. 过滤元素
使用filter方法过滤集合中的元素:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);List<Integer> evenNumbers = numbers.stream().filter(num -> num % 2 == 0).collect(Collectors.toList());System.out.println(evenNumbers); // 输出: [2, 4, 6, 8, 10]
2. 映射元素
使用map方法将集合中的元素映射成新的形式:
List<String> strings = Arrays.asList("a", "b", "c");List<String> upperCaseStrings = strings.stream().map(String::toUpperCase).collect(Collectors.toList());System.out.println(upperCaseStrings); // 输出: [A, B, C]
3. 排序元素
使用sorted方法对集合中的元素进行排序:
List<String> words = Arrays.asList("banana", "apple", "cherry");List<String> sortedWords = words.stream().sorted().collect(Collectors.toList());System.out.println(sortedWords); // 输出: [apple, banana, cherry]
4. 聚合元素
使用reduce方法对集合中的元素进行聚合操作,例如求和:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);int sum = numbers.stream().reduce(0, Integer::sum);System.out.println(sum); // 输出: 15
5. 查找元素
使用anyMatch, allMatch, noneMatch来查找匹配特定条件的元素:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);boolean allPositive = numbers.stream().allMatch(num -> num > 0);System.out.println(allPositive); // 输出: true
6. 收集到不同的集合类型
除了收集到List,你还可以收集到Set,Map等其他集合类型:
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 3, 3);Set<Integer> uniqueNumbers = numbers.stream().distinct().collect(Collectors.toSet());System.out.println(uniqueNumbers); // 输出: [1, 2, 3]
7. 分组
使用groupingBy对集合中的元素进行分组:
List<String> fruits = Arrays.asList("apple", "banana", "cherry", "date");Map<Integer, List<String>> groupedByLength = fruits.stream().collect(Collectors.groupingBy(fruit -> fruit.length()));System.out.println(groupedByLength);
// 输出:
// {
// 5=[apple],
// 6=[banana, cherry],
// 4=[date]
// }
8. 扁平化集合
使用flatMap来将集合中的元素转换成流,并将这些流扁平化成一个流:
List<List<Integer>> lists = Arrays.asList(Arrays.asList(1, 2),Arrays.asList(3, 4),Arrays.asList(5, 6)
);List<Integer> flattenedList = lists.stream().flatMap(List::stream).collect(Collectors.toList());System.out.println(flattenedList); // 输出: [1, 2, 3, 4, 5, 6]
使用Stream API可以大大简化对集合的操作,并且代码更加清晰和易于理解。不过,请注意,Stream API的操作通常是惰性的(lazy),
stream高阶用法
Java 8中的Stream API提供了许多高阶用法,这些用法允许你以更函数式的方式处理数据。下面是一些Java 8中Stream API的高阶用法示例:
1. 匹配特定条件
使用anyMatch、allMatch和noneMatch来检查Stream中的元素是否满足特定的条件。
List<String> list = Arrays.asList("a", "b", "c", "d");// 检查是否有任何元素以'a'开头
boolean anyStartWithA = list.stream().anyMatch(s -> s.startsWith("a"));
System.out.println(anyStartWithA); // 输出: true// 检查所有元素是否都以'a'开头
boolean allStartWithA = list.stream().allMatch(s -> s.startsWith("a"));
System.out.println(allStartWithA); // 输出: false// 检查是否没有元素以'z'开头
boolean noneStartWithZ = list.stream().noneMatch(s -> s.startsWith("z"));
System.out.println(noneStartWithZ); // 输出: true
2. 收集器(Collectors)
使用Collectors类来执行更复杂的聚合操作,如分组、计数、求和等。
List<String> words = Arrays.asList("apple", "banana", "cherry", "apple");// 分组
Map<String, Long> wordCount = words.stream().collect(Collectors.groupingBy(word -> word, Collectors.counting()));
System.out.println(wordCount); // 输出: {apple=2, banana=1, cherry=1}// 计数
long count = words.stream().collect(Collectors.counting());
System.out.println(count); // 输出: 4// 求和
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream().collect(Collectors.summingInt(number -> number));
System.out.println(sum); // 输出: 10// 平均值
double average = numbers.stream().collect(Collectors.averagingInt(number -> number));
System.out.println(average); // 输出: 2.5
3. 排序
使用sorted方法对Stream中的元素进行排序。
List<String> words = Arrays.asList("banana", "apple", "cherry");
List<String> sortedWords = words.stream().sorted().collect(Collectors.toList());
System.out.println(sortedWords); // 输出: [apple, banana, cherry]
4. 查找元素
使用findFirst和findAny来查找Stream中的元素。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 查找第一个元素
Optional<Integer> firstNumber = numbers.stream().findFirst();
System.out.println(firstNumber.get()); // 输出: 1// 查找任意元素(并行流中更高效)
Optional<Integer> anyNumber = numbers.parallelStream().findAny();
System.out.println(anyNumber.get()); // 输出: 任意一个数字,可能是1, 2, 3, 4, 5中的任何一个
5. 流的并行处理
使用parallelStream来并行处理数据,这在大数据集上可以提高性能。
List<Integer> numbers = IntStream.range(0, 1000000).boxed().collect(Collectors.toList());// 并行流求和
int sum = numbers.parallelStream().mapToInt(Integer::intValue).sum();
System.out.println("Sum: " + sum); // 输出: 499999500000
6. 流操作的组合
你可以组合多个流操作来创建更复杂的数据处理管道。
List<String> words = Arrays.asList("apple", "banana", "cherry");// 过滤出长度大于4的单词,转换为大写,并排序
List<String> result = words.stream().filter(word -> word.length() > 4).map(String::toUpperCase).sorted().collect(Collectors.toList());
System.out.println(result); // 输出: [BANANA]
相关文章:
Java 8中使用Stream来操作集合
Java 8中使用Stream来操作集合 在Java 8中,你可以使用Stream API来操作集合,这使得集合的处理变得更加简洁和函数式。Stream API提供了一系列的中间操作(intermediate operations)和终端操作(terminal operations&…...
MATLAB环境下一种改进的瞬时频率(IF)估计方法
相对于频率成分单一、周期性强的平稳信号来说,具有非平稳、非周期、非可积特性的非平稳信号更普遍地存在于自然界中。调频信号作为非平稳信号的一种,由于其频率时变、距离分辨率高、截获率低等特性,被广泛应用于雷达、地震勘测等领域。调频信…...
解决:selenium web browser 的版本适配问题
文章目录 解决方案:使用 webdriver manager 自动适配驱动 使用 selenium 操控浏览器的时候报错: The chromedriver version (114.0.5735.90) detected in PATH at /opt/homebrew/bin/chromedriver might not be compatible with the detected chrome ve…...
pytest.param作为pytest.mark.parametrize的参数进行调用
pytest.param:在 pytest.mark.parametrize 中可以作为一个指定的参数进行调用 获取数据库(网页端)数据,通过pytest.param包装成数据包用于pytest.mark.parametrize 中实现数据驱动调用。 import os import pytest import json fr…...
如何判断一个元素是否在可视区域中?
文章目录 一、用途二、实现方式offsetTop、scrollTopgetBoundingClientRectIntersection Observer创建观察者传入被观察者 三、案例分析参考文献 一、用途 可视区域即我们浏览网页的设备肉眼可见的区域,如下图 在日常开发中,我们经常需要判断目标元素是…...
Go Run - Go 语言中的简洁指令
原文:breadchris - 2024.02.21 也许听起来有些傻,但go run是我最喜欢的 Go 语言特性。想要运行你的代码?只需go run main.go。它是如此简单,我可以告诉母亲这个命令,她会立即理解。就像 Go 语言的大部分功能一样&…...
Spring全面精简总结
Spring两大核心功能:IOC控制反转、AOP面向切面的编程 控制反转(loC,Inversion of Control),是一个概念,是一种思想。指将传统上由程序代码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。控制反转就是…...
低代码开发如何助力数字化企业管理系统平台构建
随着数字化时代的到来,企业对于管理系统的需求日益增长。高效的管理系统可以提高企业的运作效率,降低成本,提升竞争力。然而,传统的开发方式在应对日益复杂的管理系统需求时,显得力不从心。低代码开发作为一种新兴的开…...
ElasticSearch之零碎知识点
写在前面 本文记录es的零碎知识点,包括但不限于概念,集群方式,等。 1:词项查询 VS 全文查询 词项查询:查询的内容不做分词处理,输入的什么查询什么。 全文查询:查询的内容会做分词处理&…...
【春运抢票攻略浅析】
参考 最全12306放票规则,抢票策略,候补作用2023年12306抢票攻略(纯技巧) 研究放票规则,候补的时候车次进行一下挑选,能够买长乘短的尽量买长,不要候补一些区间票吧,这是一开始放票…...
【Java EE初阶二十五】简单的表白墙(一)
1. 前端部分 1.1 前端代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"wid…...
人工智能的新浪潮:探索OpenAI的Sora视频模型及其对未来创作的影响
OpenAI的最新AI视频模型Sora,自发布以来,已成为科技界的热点。Sora的核心能力在于将文本描述转化为高清视频片段,标志着在视频生成领域的一次重大突破。Sora的特点包括使用深度理解语言的能力来准确解释提示,以及生成表达丰富情感…...
【c语言】字符函数和字符串函数(上)
前言 在编程的过程中,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,C语⾔标准库中提供了⼀系列库函数~ 欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 前言 1. 字符分…...
React18源码: schedule任务调度messageChannel
React调度原理(scheduler) 在React运行时中,调度中心(位于scheduler包)是整个React运行时的中枢(其实是心脏),所以理解了scheduler调度,就基本掌握了React的核心React两大循环:从宏…...
Jmeter 学习目录
Jmeter 所有内容均以学习为主输出内容,按照最小单位和基础进行输出。 如果有看不懂,或者有不明确的内容,欢迎大家留言说明。 Jmeter系列(1)Mac Jmeter下载安装启动 Jmeter系列(2)Jmeter 目录介…...
计算机网络 数据链路层课后题
1.以太网帧有哪些不同的封装格式?他们有何区别和应用场景? 以太网II封装(Ethernet II):以太网II封装是最常用的以太网封装格式,也被称为DIX封装。它在数据链路层首部使用6个字节的目的MAC地址和6个字节的源…...
实现验证码功能
Kaptcha 文章目录 Kaptcha介绍插件使用介绍原理引入依赖生成验证码 验证码小项目初始化前端代码约定前后端交互接口接口定义 介绍 Kaptcha 是Google的⼀个⾼度可配置的实⽤验证码⽣成⼯具 https://code.google.com/archive/p/kaptcha ⽹上有很多⼈甚⾄公司基于Google的kaptc…...
PyQt6的开发流程(密码生成小程序为例)
PyQt6的开发流程(密码生成小程序为例) 文章目录 PyQt6的开发流程(密码生成小程序为例)一、流程介绍与概览1. 界面与逻辑分离的开发流程2. PyQt6的开发流程 二、打开 designer.exe 创建文件三、用QT设计师绘制界面保存成ui1. QT常用…...
思腾云计算中心 | 5千平米超大空间,基础设施完善,提供裸金属GPU算力租赁业务
2021年,思腾合力全资收购包头市易慧信息科技有限公司,正式开启云计算业务。思腾云计算中心占地2400平米,位于包头市稀土高新区,毗邻多家知名企业,地理位置优越,交通便利,是区内重要的信息化产业…...
【Leetcode每日一题】二分查找 - 在排序数组中查找元素的第一个和最后一个位置(难度⭐⭐)(18)
1. 题目解析 Leetcode链接:34. 在排序数组中查找元素的第一个和最后一个位置 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 核心在于找到给定目标值所在的数组下标区间,设计一个O(logn)的算法。 2. 算法原…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
