java8之Stream流
文章目录
- Stream流的定义和特性
- 定义
- 特性
- 中间操作
- 终结操作
- 生成流
- forEach
- map
- filter
- limit
- sorted
- 并行(parallel)程序
- Collectors
Stream流的定义和特性
定义
Stream是Java 8 API添加的一个新的抽象,用于以声明性方式处理数据集合。它不是一种数据结构,而是某种数据源的一个视图,支持序列与并行两种操作方式3。
特性
Stream流的操作是惰性的,只有在需要结果时才会执行。这使得Stream流在处理大量数据时更加高效。此外,Stream流与Lambda表达式结合使用,可以提高编程效率、间接性和程序可读性。
Stream流的常见操作:
中间操作
包括过滤(filter)、排序(sorted)、截取(limit)、跳过(skip)等,用于打开流并处理数据,生成新的流。
终结操作
如forEach()、collect()等,用于最终获取结果。终结操作执行后,流无法再进行操作。
生成流
- 通过集合生成:对于Collection体系的集合,可以使用默认方法stream()生成流。例如,对于List、Set等集合,可以直接调用它们的stream()方法生成流12。
- 通过数组生成:数组可以通过Arrays类的静态方法stream()生成流。例如,对于String[] strArray数组,可以使用Arrays.stream(strArray)生成流。
- 通过Stream接口的静态方法生成:对于同种数据类型的多个数据,可以通过Stream接口的静态方法of()生成流。例如,Stream.of(“hello”, “world”, “java”)可以生成包含这些字符串的流
forEach
Stream 提供了新的方法 ‘forEach’ 来迭代流中的每个数据。以下代码片段使用 forEach 输出了10个随机数:
Random random = new Random();
//输出随机数
random.ints().limit(10).forEach(System.out::println);
//forEach进行操作
map
map 方法用于映射每个元素到对应的结果,以下代码片段使用 map 输出了元素对应的平方数:
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList()); // 获取对应的平方数
filter
filter 方法用于通过设置的条件过滤出元素。以下代码片段使用 filter 方法过滤出空字符串:
List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");long count = strings.stream().filter(string -> string.isEmpty()).count(); // 获取空字符串的数量List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
limit
limit 方法用于获取指定数量的流。 以下代码片段使用 limit 方法打印出 10 条数据:
Random random = new Random();random.ints().limit(10).forEach(System.out::println);
sorted
sorted 方法用于对流进行排序。以下代码片段使用 sorted 方法对输出的 10 个随机数进行排序:
Random random = new Random();random.ints().limit(10).sorted().forEach(System.out::println);
并行(parallel)程序
parallelStream 是流并行处理程序的代替方法。以下实例我们使用 parallelStream 来输出空字符串的数量:
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 获取空字符串的数量
long count = strings.parallelStream().filter(string -> string.isEmpty()).count();
我们可以很容易的在顺序运行和并行直接切换。
Collectors
Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。Collectors 可用于返回列表或字符串:
List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());System.out.println("筛选列表: " + filtered);String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));System.out.println("合并字符串: " + mergedString);
示例:
package main.java;import javax.swing.*;
import java.util.*;
import java.util.stream.Collectors;/*** @author Administrator*/
public class StreamTest {public static void main(String[] args) {System.out.println("使用java7");List<String> strList = Arrays.asList("AAA","","BBB","","CCC","DDDDD","","EEEE","","FFFFFF");System.out.println("strList列表:"+strList.toString());//计算空字符串个数long count = calculateEmptyStr(strList);System.out.println("strList列表空字符串个数:"+count);//计算字符串长度=3的个数count = calculateStrLengthEqual3(strList);System.out.println("strList列表字符串长度为3的个数:"+count);//删除空字符串List<String> str1List = deleteEmptyStr(strList);System.out.println("strList列表去除空字符串的列表为:"+ str1List.toString());//拼接字符串String str1 = deleteEmptyAndJoinStr(strList,",");System.out.println("strList列表拼接字符串:"+str1);List<Integer> intList = Arrays.asList(3,4,5,6,7,8,9,10);System.out.println("intList列表为:"+intList);//计算列表元素平方数List<Integer> int2List = getIntegerSquares(intList);System.out.println("intList的平方数列表为:"+int2List);List<Integer> int1List = Arrays.asList(2,5,6,7,3,8,1,11,22,25,18);//计算最大数,最小数,平均数,所有数之和System.out.println("int1List列表:"+int1List);System.out.println("int1List列表的最大数:" + getIntegerListMax(int1List));System.out.println("int1List列表的最小数:" + getIntegerListMin(int1List));System.out.println("int1List列表的所有数之和:"+ getListSum(int1List));System.out.println("int1List列表的平均数:" + getAverage(int1List));//输出10个随机数Random random = new Random();for (int i = 0; i < 10 ; i++) {System.out.println(random.nextInt());}System.out.println("使用java8:");System.out.println("strList列表:"+ strList.toString());System.out.println("strList列表空字符串个数:"+ strList.stream().filter(string -> string.isEmpty()).count());System.out.println("strList列表字符串长度为3的个数:"+ strList.stream().filter(string -> string.length() == 3).count());System.out.println("strList列表去除空字符串的列表为:"+ strList.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList()));System.out.println("strList列表拼接字符串:"+ strList.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(",")));System.out.println("intList列表为:"+ intList);System.out.println("intList的平方数列表为:"+ intList.stream().map(i -> i*i).distinct().collect(Collectors.toList()));System.out.println("int1List列表:"+int1List);IntSummaryStatistics statistics = int1List.stream().mapToInt((x) -> x).summaryStatistics();System.out.println("int1List列表的最大数:" + statistics.getMax());System.out.println("int1List列表的最小数:" + statistics.getMin());System.out.println("int1List列表的所有数之和:"+ statistics.getSum());System.out.println("int1List列表的平均数:" + statistics.getAverage());//输出十个随机数random.ints().limit(10).sorted().forEach(System.out::println);}private static Integer getListSum(List<Integer> int1List) {Integer result = 0;for (Integer integer : int1List) {result += integer;}return result;}private static Integer getAverage(List<Integer> int1List) {Integer result = 0;Integer sum = 0;for (Integer integer : int1List) {sum += integer;}result = sum/int1List.size();return result;}private static Integer getIntegerListMax(List<Integer> int1List) {int max = int1List.get(0);for (int i = 1;i<int1List.size();i++){if(max <= int1List.get(i)){max = int1List.get(i);}}return max;}private static Integer getIntegerListMin(List<Integer> int1List) {int min = int1List.get(0);for (int i = 1;i<int1List.size();i++){if(min >= int1List.get(i)){min = int1List.get(i);}}return min;}private static List<Integer> getIntegerSquares(List<Integer> intList) {List<Integer> resultList = new ArrayList<Integer>();for (Integer integer : intList) {integer *= integer;resultList.add(integer);}return resultList;}private static String deleteEmptyAndJoinStr(List<String> str1List,String separator) {StringBuilder resultStr = new StringBuilder();for (String s : str1List) {if (!s.isEmpty()){resultStr.append(s);resultStr.append(separator);}}return resultStr.substring(0,resultStr.length()-2);}private static List<String> deleteEmptyStr(List<String> strList) {List<String> result = new ArrayList<String>();for (String s : strList) {if (!s.isEmpty()){result.add(s);}}return result;}private static long calculateStrLengthEqual3(List<String> strList) {long result = 0;for (String s : strList) {if (s.length() == 3){result += 1;}}return result;}private static long calculateEmptyStr(List<String> strList) {long result = 0;for (String s : strList) {if (s.isEmpty()){result += 1;}}return result;}
}
相关文章:
java8之Stream流
文章目录 Stream流的定义和特性定义特性中间操作终结操作 生成流forEachmapfilterlimitsorted并行(parallel)程序Collectors Stream流的定义和特性 定义 Stream是Java 8 API添加的一个新的抽象,用于以声明性方式处理数据集合。它…...
pipx安装提示找不到包
执行: pipx install --include-deps --force "ansible6.*"WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connection broken by NewConnectionError(<pip._vendor.urllib3.connection.HTTPSConnection …...
Codeforces Round 987 (Div. 2)(前四道)
A. Penchick and Modern Monument 翻译: 在繁华大都市马尼拉的摩天大楼中,菲律宾最新的 Noiph 购物中心刚刚竣工!建筑管理方 Penchick 订购了一座由 n 根支柱组成的先进纪念碑。 纪念碑支柱的高度可以用一个由 n 个正整数组成的数组 h 来表示…...
PCB+SMT线上报价系统+PCB生产ERP系统自动化拼板模块升级
PCB生产ERP系统的智能拼版技术,是基于PCB前端报价系统获取到的用户或市场人员已录入系统的板子尺寸及set参数等,按照最优原则或利用率最大化原则自动进行计算并输出拼版样式图和板材利用率,提高工程人员效率,减少板材的浪费。覆铜…...
微信小程序_小程序视图与逻辑_day3
一、目标 A. 能够知道如何实现页面之间的导航跳转 B. 能够知道如何实现下拉刷新效果 C. 能够知道如何实现上拉加载更多效果 D. 能够知道小程序中常用的生命周期 二、目录 A. 页面导航 B. 页面事件 C. 生命周期 D. WXS脚本 E. 案例-本地生活(列表页面)…...
kubesphere环境-本地Harbor仓库+k8s集群(单master 多master)+Prometheus监控平台部署
前言:半月前在公司生产环境上离线部署了k8s集群Victoria Metrics(二开版)自研版夜莺 监控平台的搭建,下面我租用3台华为云服务器演示部署kubesphere环境-本地Harbor仓库k8s集群(单master节点 & 单master节点)Prometheus监控部…...
【提高篇】3.3 GPIO(三,工作模式详解 上)
目录 一,工作模式介绍 二,输入浮空 2.1 输入浮空简介 2.2 输入浮空特点 2.3 按键检测示例 2.4 高阻态 三,输入上拉 3.1 输入上拉简介 3.2 输入上拉的特点 3.3 按键检测示例 四,输入下拉 4.1 输入下拉简介 4.2 输入下拉特点 4.3 按键检测示例 一,工作模式介绍…...
‘视’不可挡:OAK相机助力无人机智控飞行!
南京邮电大学通达学院的刘同学用我们的oak-d-lite实现精确打击无人机的避障和目标识别定位功能,取得了比赛冠军。我们盼望着更多的朋友们能够加入到我们OAK的队伍中来,参与到各式各样的比赛中去。我们相信,有了我们相机的助力,大家…...
javaScript交互补充(元素的三大系列)
1、元素的三大系列 1.1、offset系列 1.1.1、offset初相识 使用offset系列相关属性可以动态的得到该元素的位置(偏移)、大小等 获得元素距离带有定位祖先元素的位置获得元素自身的大小(宽度高度)注意:返回的数值都不…...
数据结构(基本概念及顺序表)
基本概念: 1、引入 程序数据结构算法 数据: 数值数据:能够直接参加运算的数据(数值,字符) 非数值数据:不能够直接参加运算的数据(字符串、图片等) 数据即是信息的载…...
【全面系统性介绍】虚拟机VM中CentOS 7 安装和网络配置指南
一、CentOS 7下载源 华为源:https://mirrors.huaweicloud.com/centos/7/isos/x86_64/ 阿里云源:centos-vault-7.9.2009-isos-x86_64安装包下载_开源镜像站-阿里云 百度网盘源:https://pan.baidu.com/s/1MjFPWS2P2pIRMLA2ioDlVg?pwdfudi &…...
html + css 自适应首页布局案例
文章目录 前言一、组成二、代码1. css 样式2. body 内容3.全部整体 三、效果 前言 一个自适应的html布局 一、组成 整体居中,宽度1200px,小屏幕宽度100% 二、代码 1. css 样式 代码如下(示例): <style>* {…...
时钟之CSS+JS版
写在前面 此版本绘制的时钟基于CSSJS模式。 优点操作简单,缺点当然是不够灵活。下一篇会基于HTML5的canvas标签,使用JS绘制。会更灵活,元素更加丰富。 HTML代码 <div class"box"><article class"clock"><…...
ubuntu18.04 配置安卓编译环境
目前有个项目,验收时有个要求是在linux中进行编译打包生成apk文件。我平时都是在windows环境android studio中进行打包的,花了半天时间研究了一下,记录如下: 安装安卓sdk cd /opt wget https://dl.google.com/android/reposito…...
pycharm分支提交操作
一、Pycharm拉取Git远程仓库代码 1、点击VCS > Get from Version Control 2、输入git的url,选择自己的项目路径 3、点击Clone,就拉取成功了 默认签出分支为main 选择develop签出即可进行开发工作 二、创建分支(非必要可以不使用…...
ESP32-C3 开发笔记 之 arduino 正常上传 串口乱码2024/11/15
ESP32-C3 开发笔记 之 arduino 正常上传 串口乱码 ESP32-C3 开发笔记 之 arduino 正常上传程序 但是打开串口,串口快速刷新 芯片一直处于重启状态 找了很久的原因没找到,用Mixly 上传就正常 最后看到这篇 文章https://blog.csdn.net/luooove/article/details/132351398修改了Fl…...
Ubuntu 的 ROS 操作系统 turtlebot3 SLAM仿真
引言 SLAM(同步定位与地图构建)在Gazebo仿真环境中的应用能够模拟真实机器人进行环境建图和导航。通过SLAM仿真,开发者可以在虚拟环境中测试算法,而不必依赖真实硬件,便于调试与优化。 Gazebo提供了多个虚拟环境&…...
2024年11月15日
1.计算机网络 逻辑右移 做加减法 定点乘法 原码乘法运算 一位乘 计组 2.英语六级...
websocket初始化
websocket初始化 前言 上一集我们HTTP的ping操作就可以跑通了,那么我们还有一个协议---websocket,我们在这一集就要去完成我们websocket的初始化。 分析 我们在初始化websocket的之前,我们考虑一下,我们什么时候就要初始化我们…...
uniapp ios app以framwork形式接入sentry
一、下载Sentry mac终端输入:vim Podfile修改Podfile: platform :ios, 11.0 target YourApp douse_frameworks! # This is importantpod Sentry, :git > https://github.com/getsentry/sentry-cocoa.git, :tag > 8.40.1 end执行:pod install下载…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...
背包问题双雄:01 背包与完全背包详解(Java 实现)
一、背包问题概述 背包问题是动态规划领域的经典问题,其核心在于如何在有限容量的背包中选择物品,使得总价值最大化。根据物品选择规则的不同,主要分为两类: 01 背包:每件物品最多选 1 次(选或不选&#…...
Linux中INADDR_ANY详解
在Linux网络编程中,INADDR_ANY 是一个特殊的IPv4地址常量(定义在 <netinet/in.h> 头文件中),用于表示绑定到所有可用网络接口的地址。它是服务器程序中的常见用法,允许套接字监听所有本地IP地址上的连接请求。 关…...
