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下载…...

⾃动化运维利器Ansible-基础
Ansible基础 一、工作原理二、快速入门2.1 测试所有资产的网络连通性2.2 发布文件到被管理节点(资产) 三、资产(被管理节点)3.1 静态资产3.1.1 自定义资产3.1.2 自定义资产的使用3.1.3 资产选择器 四、Ansible Ad-Hoc 命令4.1 模块类型4.1.1 command & shell 模块4.1.2 cop…...

若依笔记(十一):芋道多租户限制与修改
目录 多租户实现 哪些表是多租户的? YudaoTenant自动装载类 租户隔离的sql在哪? 如何修改成无租户隔离 全局修改 表级别 请求RUL级别 芋道比若依多了租户概念,这也是因为它增加很多业务系统,首先后台管理系统肯定是多租户的,这意味着如商城系统的产品管理SPU、库存…...

hive 统计各项目下排名前5的问题种类
实现指定某项目下的数据效果图如下所示: 其中 ABCDE 为前5名的问题种类,其中A问题有124个(出现了124次) 数据说明: 整个数据集 包含很多项目一个项目 包含很多问题一个问题 选项 可认为是 类别值,所有出…...

HBase 安装与基本操作指南
以下是关于 Apache HBase 安装、配置以及简单操作的详细指南: HBase 简介 Apache HBase 是一个基于 Hadoop 的分布式数据库,擅长处理大规模、结构化的海量数据。它采用行列式存储方式,与 Hadoop 和 HDFS 紧密结合,是支持大数据实…...

Spring Boot应用中的文件压缩与解压技术实践
在构建Spring Boot应用时,文件压缩与解压是处理大量数据、优化存储和传输速度的常用技术。本文旨在深入探讨Spring Boot应用中文件压缩与解压的实现方法,包括常见压缩算法的选择、Spring Boot中的实现策略以及实际应用场景中的最佳实践。 引言 随着大数…...

D69【 python 接口自动化学习】- python 基础之数据库
day69 Python 执行 SQL 语句 学习日期:20241115 学习目标: MySQL 数据库﹣- Python连接redis 学习笔记: redis数据库的用途 使用Python访问redis数据库 使用Python对redis数据库进行读写操作 总结 1. redis是一款高性能的键…...

410. 分割数组的最大值
目录 题目解法 题目 给定一个非负整数数组 nums 和一个整数 k ,你需要将这个数组分成 k 个非空的连续子数组,使得这 k 个子数组各自和的最大值 最小。 返回分割后最小的和的最大值。 子数组 是数组中连续的部份。 解法 int splitArray(vector<in…...

Azure pipeline 通过git命令修改文件
步骤及解释 设置git用户名 git config --global user.email "useremail" git config --global user.name "username" 获取branch $branch "$(Build.SourceBranch)" -replace "refs/heads/" "$(Build.SourceBranch)"&a…...

LeetCode74. 搜索二维矩阵(2024冬季每日一题 6)
给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。…...

BPMN 2.0详细介绍
BPMN 2.0(Business Process Model and Notation 2.0)是一个标准化的图形化建模语言,用于描述业务流程和工作流。它是由 Object Management Group (OMG) 制定的,旨在提供一种标准化的方式,帮助企业和开发者清晰地建模、…...