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下载…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
