Java进阶之旅第六天

Java进阶之旅第六天

Stream流

Stream的思想

  • Stream流中引入函数式编程的思想,以类似流水线的方式处理数据,使得代码更加高效整洁
  • Stream中提供并行处理的能力,可以将数据分成多个子任务,并行处理

各类型的调用方法

类型方法说明
单列集合default Stream streamCollection中默认的方法
双列集合无(需要转成单列结合后使用无法直接使用stream流
数组public static Stream stream(T[] array)Arrays工具类的静态方法
一堆零散的数据public static Stream of(T…values)Stream接口中的静态方法
  • Stream接口中静态方法of的细节:
    • 1.方法的形参是一个可变参数,可以传递一堆零散的数据,也可以传递数组
    • 2.但是数组必须是引用数据类型的,如果传递基本数据类型,是会把整个数组当做一个元素,放到Stream当中
代码演示
//集合流水线StreamSystem.out.println("----单列集合---");ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(3);list.add(2);list.stream().forEach(s-> System.out.println(s));//双列结合System.out.println("----双列集合---");HashMap<String,Integer> hm = new HashMap<>();hm.put("1",2);hm.put("2",1);hm.put("3",3);hm.keySet().stream().forEach(s-> System.out.println(s));hm.entrySet().stream().forEach(s-> System.out.println(s));//数组System.out.println("----数组---");int[] arr1 = {1,2,3};Arrays.stream(arr1).forEach(s-> System.out.println(s));//零散的数据(数据类型要一致System.out.println("----零散的数据---");Stream.of(1,2,3,4).forEach(s-> System.out.println(s));System.out.println("----细节1----");String[] arr2 = {"1","2","3"};Stream.of(arr2).forEach(s-> System.out.println(s));System.out.println("----细节2----");int[] arr3 = {1,2,3};Stream.of(arr3).forEach(s-> System.out.println(s));
结果
----单列集合---
1
3
2
----双列集合---
1
2
3
1=2
2=1
3=3
----数组---
1
2
3
----零散的数据---
1
2
3
4
----细节1----
1
2
3
----细节2----
[I@6d03e736

Stream中间方法

名称说明
Stream filter(Predicate<?super T> predicate)过滤
Stream limit(long maxSize)获取前几个元素
Stream skip(long n)跳过前几个元素
Stream distinct()元素去重,依赖(hashCode和equals方法
static Stream concat(Stream a,Stream b)合并a和b两个流为一个流
Stream map(Function<T,R> mapper)转换流中的数据
  • 注意:
    • 1.中间方法,返回新的Stream流,原来的Stream流只使用一次,建议使用链式编程
    • 2.修改Stream流中的数据,不会影响原来集合或者数组中的数据
代码演示
        //创建原始数据ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"张小兰","小名","小肖","张三","张三");System.out.println("----过滤(留下第一个字是小的----");//不使用lambda表达式/*list.stream().filter(new Predicate<String>() {@Overridepublic boolean test(String s) {//如果返回为true,表示当前数据留下//如果返回为false,表示当前数据舍弃return s.startsWith("小");}}).forEach(s -> System.out.println(s));*///使用lambda表达式list.stream().filter(s->s.startsWith("小")).forEach(s-> System.out.println(s));System.out.println("----获取前几个元素");list.stream().limit(3).forEach(s-> System.out.println(s));System.out.println("----跳过前几个元素");list.stream().skip(3).forEach(s-> System.out.println(s));System.out.println("----skip和limit结合使用获取'小肖'");list.stream().skip(2).limit(1).forEach(s-> System.out.println(s));System.out.println("----元素去重(去除张三");list.stream().distinct().forEach(s -> System.out.println(s));System.out.println("----合并a和b两个流为一个流");ArrayList<String> list2 = new ArrayList<>();Collections.addAll(list2,"张小第","小哦");Stream.concat(list.stream(),list2.stream()).forEach(s-> System.out.println(s));System.out.println("----转换流中的数据(获取年龄并打印");ArrayList<String> list3 = new ArrayList<>();Collections.addAll(list3,"张小兰-14","小名-15");//不使用lambda表达式System.out.println("----不使用lambda表达式");list3.stream().map(new Function<String, Integer>() {//第一个类型: 原本的类型//第二个类相关: 想要转换的类型//apply的形参s: 表示流中的每一个数据//返回值: 转换类型后的值@Overridepublic Integer apply(String s) {String[] arr = s.split("-");//类型转换return Integer.parseInt(arr[1]);}}).forEach(s-> System.out.println(s));//使用lambda表达式System.out.println("----使用lambda表达式");list3.stream().map(s->Integer.parseInt(s.split("-")[1])).forEach(s-> System.out.println(s));
结果
----过滤(留下第一个字是小的----
小名
小肖
----获取前几个元素
张小兰
小名
小肖
----跳过前几个元素
张三
张三
----skip和limit结合使用获取'小肖'
小肖
----元素去重(去除张三
张小兰
小名
小肖
张三
----合并a和b两个流为一个流
张小兰
小名
小肖
张三
张三
张小第
小哦
----转换流中的数据(获取年龄并打印
----不使用lambda表达式
14
15
----使用lambda表达式
14
15

Stream流的终结方法

名称说明
forEach(Consumer action)遍历
long count()统计
toArray()收集流中的数据,放到数组中
collect(Collector collector)(难点)收集流中的数据,放到集合中
  • toArray()方法的作用: 负责创建一个指定类型的数组
代码
        //创建原始数据ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"张小兰","小名");System.out.println("----遍历");System.out.println("----不使用lambda");list.stream().forEach(new Consumer<String>() {@Overridepublic void accept(String s) {//对数据进行操作System.out.println(s);}});System.out.println("----使用lambda");list.stream().forEach(s-> System.out.println(s));System.out.println("----统计");long count = list.stream().count();System.out.println(count);System.out.println("----收集流中的数据,放到数组中");System.out.println("---空参构造");Object[] arr1 = list.stream().toArray();System.out.println(Arrays.toString(arr1));System.out.println("---非空参构造");String[] arr2 = list.stream().toArray(new IntFunction<String[]>() {//泛型: 具体类型的数组//形参: 流中数据的个数,要跟数组的长度一致//方法体: 创建数组@Overridepublic String[] apply(int value) {return new String[value];}});System.out.println(Arrays.toString(arr2));System.out.println("----表达式");String[] arr3 = list.stream().toArray(value -> new String[value]);System.out.println(Arrays.toString(arr3));System.out.println("---收集流中的数据,放到集合中");//收集到list集合中System.out.println("收集到list集合中");List<String> arrl = list.stream().collect(Collectors.toList());System.out.println(arrl);System.out.println("收集到set集合中");Set<String> arrs = list.stream().collect(Collectors.toSet());System.out.println(arrs);System.out.println("收集到map集合中");//需要指定谁为键,谁为值//需要重写对应规则//Function第一个参数是原本流中的数据类型//第二个参数是指定键/值的数据类型//apply形参: 依次表示流中的每一个数据//方法体: 生成键的代码//返回值: 已经生成的键/值//细节: 键不能重复Map<String,String> arrm = list.stream().collect(Collectors.toMap(new Function<String, String>() {//键的规则@Overridepublic String apply(String s) {//键就是名字return s;}}, new Function<String, String>() {//值的规则@Overridepublic String apply(String s) {//值也是名字return s;}}));System.out.println(arrm);//lambda表达式System.out.println("---使用lambda表达式");Map<String,String> arrm2 = list.stream().collect(Collectors.toMap(s -> s ,s->s));System.out.println(arrm2);
结果
----遍历
----不使用lambda
张小兰
小名
----使用lambda
张小兰
小名
----统计
2
----收集流中的数据,放到数组中
---空参构造
[张小兰, 小名]
---非空参构造
[张小兰, 小名]
----表达式
[张小兰, 小名]
---收集流中的数据,放到集合中
收集到list集合中
[张小兰, 小名]
收集到set集合中
[张小兰, 小名]
收集到map集合中
{张小兰=张小兰, 小名=小名}
---使用lambda表达式
{张小兰=张小兰, 小名=小名}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/640626.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

请写出js中的两种定时器,区别是什么?怎么清除定时器?

在JavaScript中有两种常用的定时器&#xff1a;setTimeout 和 setInterval。 setTimeout&#xff1a;此函数用于在指定的毫秒数后执行一次函数或计算出的表达式。例如&#xff0c;如果你想在5秒后打印一条消息&#xff0c;你可以这样做&#xff1a; var myTimer setTimeout(f…

下载csdn文章,并保存md笔记中的图片链接至本地

推荐1个下载别人csdn文章笔记的java项目&#xff1a;csdn-blog2markword-downloader 拿到别人的md笔记后&#xff0c;但是笔记中的图片又是以链接的格式给的&#xff0c;这个链接说不定后面就失效了&#xff0c;笔记也就看不到图片了。手动右键也可以保存图片&#xff0c;但是…

前端学习笔记 7:小兔鲜

前端学习笔记 7&#xff1a;小兔鲜 准备工作 创建项目 创建项目&#xff1a; npm init vuelatest相关选项如下&#xff1a; 在src目录下添加以下目录&#xff1a; 别名路径联想 默认情况下在 VSCode 中输入import xxx from ...时不会启用路径联想功能&#xff0c;要启用需…

使用宝塔面板安装wiki.js详细教程

因为在安装过程中遇到了一些问题&#xff0c;花费了很长时间在解决问题上。根据这篇教程可以少踩很多坑。点赞加关注吧。 准备运行环境 Nodejs 在宝塔面板的软件商店中找到nodejs版本管理器并安装。 点击设置&#xff0c;选择一个稳定版安装。 PostgreSQL 官方推荐的数据库是…

用户洞察:精准解读用户的真实需求!

洞察用户需求的过程和谈恋爱一样。你不能简简单单地问客户&#xff0c;你想要什么&#xff1f;你有什么痛点&#xff1f;这样的问法是无法得到任何有价值的信息。这就好比谈恋爱的场景&#xff0c;如果你问对方想吃什么&#xff0c;大概率会得到“随便”“都行”这类的答案&…

Python实现一个简单的烟花秀效果(附带源码)

在 Python 中实现一个简单的烟花秀效果&#xff0c;可以使用 turtle 模块进行绘图。以下是一个简单的例子&#xff1a; import turtle import random import math# 设置画布 turtle.speed(0) turtle.hideturtle() turtle.bgcolor("black")def create_firework(x, y)…

力扣62. 不同路径

动态规划 思路&#xff1a; 定义 dp[r][c] 为到达坐标 (r, c) 的路径数&#xff1a; 它只能有同一行左边相邻方格向右到达或者同一列上方相邻方格向下到达&#xff1b;状态转移方程&#xff1a; dp[r][c] dp[r][c - 1] dp[r - 1][c]初始状态 dp[0][0] 1第一行的路径数是 1第…

2526. 随机数生成器(BSGS,推导)

题目路径&#xff1a; https://www.acwing.com/problem/content/2528/ 思路&#xff1a;

HNU-数据挖掘-实验1-实验平台及环境安装

数据挖掘课程实验实验1 实验平台及环境安装 计科210X 甘晴void 202108010XXX 文章目录 数据挖掘课程实验<br>实验1 实验平台及环境安装实验背景实验目标实验步骤1.安装虚拟机和Linux平台&#xff0c;熟悉Ubuntu环境。2.在Linux平台上搭建Python平台&#xff0c;并安装…

esp32-idf eclipse 分区表(partition table / NVS)的读写demo

前言&#xff1a; 分区表&#xff08;Partition Table&#xff09;和 NVS&#xff08;Non-Volatile Storage&#xff09;是 ESP-IDF 中用于存储数据的两种不同机制。 分区表&#xff08;Partition Table&#xff09;&#xff1a; 分区表定义了将 Flash 存储器划分为不同逻辑分…

RT-DETR 模型改进 | AKConv:具有任意采样形状和任意参数数量的卷积核

基于卷积操作的神经网络在深度学习领域取得了显著的成果,但标准卷积操作存在两个固有缺陷。一方面,卷积操作受限于局部窗口,无法捕捉其他位置的信息,而其采样形状是固定的。另一方面,卷积核的大小固定为kk,呈固定的正方形形状,而参数数量往往随大小呈平方增长。显然,不…

2024 年大促入手哪些云服务器实用划算?

2024年各大云厂商的“价格战”又已拉开帷幕&#xff0c;作为用户的我们最为关心的是这些云服务商的年终大促中&#xff0c;实用划算的云服务器配置有哪些&#xff1f;小编看了一下&#xff0c;今年的年终大促活动中&#xff0c;国内云平台几位大佬&#xff0c;阿里云&#xff0…

C++入门学习(十一)字符型

C中的字符型可以表示ASCII码中的所有字符&#xff0c;包括字母、数字、标点符号等。 ASCII码是一种用于编码字符的编码系统&#xff0c;它使用不同的数值来表示不同的字符。ASCII码使用7位或8位二进制数来表示每个字符&#xff0c;因此可以表示128或256个不同的字符。 在ASCI…

构建开源的多模态 RAG 系统

每日推荐一篇专注于解决实际问题的外文,精准翻译并深入解读其要点,助力读者培养实际问题解决和代码动手的能力。 欢迎关注公众号(NLP Research),及时查看最新内容 原文标题:Building an Open Source Multi-Modal RAG System 原文地址:https://medium.com/nadsoft/buil…

性能利器Caffeine缓存全面指南

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;今天咱们聊聊Caffeine缓存&#xff0c;小黑在网上购物&#xff0c;每次查看商品都要等几秒钟&#xff0c;那体验肯定不咋地。但如果用了缓存&#xff0c;常见的商品信息就像放在口袋里一样&#xff0c;随时取用&…

Ubuntu22.04安装各种常用软件-目录

0、基本环境搭建 Ubuntu 22.04 基础环境搭建 1、安全类 Ubuntu 22.04 安装Fail2Ban 2、监控类 Ubuntu 22.04 安装prometheus 3、工具类 Ubuntu 22.04 Cron使用 Ubuntu 22.04 安装docker 4、数据库 Ubuntu 22.04 安装MySql 5、集群类 Ubuntu 22.04 安装docker

Linux查找日志常用命令

tail tail命令常使用选项-f -f, --follow[{name|descriptor}]output appended data as the file grows;an absent option argument means descriptor例如&#xff1a; tail -1000f sys.log按回车键增加空白行&#xff0c;按Ctrl C 结束 vi / vim vi 文件名 如&#xff1a;…

杭电网课笔记

技巧 1.判断得数为整数还是小数&#xff0c;可以%1&#xff0c;得数为0是整数 或者用instanceof Integer number 9; // 自动装箱 System.out.println(number instanceof Integer); // 输出&#xff1a;true 2.a * b 最大公约数 * 最小公倍数 LCM 最小公倍数 GCD 最大公…

Java:扫码登录

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、需求背景 二、问题分析 三、对比APP和打印机设备的特点 四、设计 五、编码 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、…

美团收银餐饮版培训教程

硬件连接方式及介绍: 双屏收银机 收银一体机 双屏收银机连接图 收银一体机连接图 前台打印机 后厨打印机 标签打印机 前台打印机连接图 后厨打印机连接图 其它收银机配件 软件前期设置 1、机器联网 点开桌面的设置&#xff0c;点击更多&#xff0c;点击以太网&#xff0c;最上…