java加强 -stream流
Stream流是jdk8开始新增的一套api,可以用于操作集合或数组的内容。
Stream流大量的结合了Lambda的语法风格来编程,功能强大,性能高效,代码简洁,可读性好。
体验Stream流
把集合中所有以三开头并且三个字的元素存储到一个新集合。
package streamDemo;import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;public class StreamDemo1 {public static void main(String[] args) {//目标:认识stream流,掌握基本使用步骤,体会它的优势List<String> list = new ArrayList<>();list.add("张无忌");list.add("周芷若");list.add("赵敏");list.add("张强");list.add("张无忌");list.add("张三丰");list.add("张小四");//用传统方案找出姓张的人名字为三个字的存入到新集合中List<String> newList = new ArrayList<>();for(String name : list){if(name.startsWith("张")&&name.length()==3){newList.add(name);}}System.out.println(newList);//用stream流List<String> newList2=list.stream().filter(s -> s.startsWith("张")).filter(s ->s.length()==3).collect(Collectors.toList());System.out.println(newList2);}
}
相较于传统方法的排序和筛选,stream流只需要一行就可以实现功能,代码更简洁。
获取Stream流
语法:
Stream<集合或数组内存储的数据类型> 变量名 = 数组或集合名.stream();
示例
package streamDemo;import java.util.*;
import java.util.stream.Stream;public class StreamDemo2 {public static void main(String[] args) {//获取stream流的方式//1、获取集合的stream流,调用集合提供的stream()方法Collection<String> list = new ArrayList<>();Stream<String> s1 = list.stream();//2、Map集合Map<String,Integer> map = new HashMap<>();//获取它的键流Stream<String> s2 = map.keySet().stream();//值流Stream<Integer> s3 = map.values().stream();//键值对流Stream<Map.Entry<String, Integer>> s4 = map.entrySet().stream();//3、数组的流String[] names = {"张三丰","张学友","张学良"};Stream<String> s5 = Arrays.stream(names);System.out.println(s5.count());Stream<String> s6 = Stream.of(names);Stream<String> s7 = Stream.of("张三丰", "张无忌", "张三");}
}
Stream流的常用中间方法
中间方法指的是,使用完这个方法后,会返回一个新的Stream流,例如筛选完姓张的人后返回一个只有姓张的人的集合用于后续操作。
获取的Stream流可以使用多个中间方法进行筛选,直到选出我们需要的数据。
常用的几种方法有:过滤方法、合并方法、映射/加工方法等
Stream流中若是需要为自定义数据类型规定排序规则/筛选规则,可以使用Lambda方法。
示例
package streamDemo;import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class StreamDemo3 {public static void main(String[] args) {//掌握Stream流常用的中间方法,对流上的数据进行处理(返回新流:支持链式存储)List<String> list = new ArrayList<>();list.add("张无忌");list.add("周芷若");list.add("赵敏");list.add("张强");list.add("张无忌");list.add("张三丰");list.add("张小四");//过滤方法list.stream().filter(s -> s.startsWith("张")).filter(s ->s.length()==3).forEach(s -> System.out.println(s));//排序方法List<Double> scorce = new ArrayList<>();scorce.add(99.8);scorce.add(98.7);scorce.add(83.7);scorce.add(67.5);scorce.add(67.5);scorce.stream().sorted().forEach(s-> System.out.println(s));//升序System.out.println("=============================");scorce.stream().sorted((s1,s2)->Double.compare(s2,s1)).forEach(s-> System.out.println(s));//降序System.out.println("=============================");scorce.stream().sorted((s1,s2)->Double.compare(s2,s1)).limit(2).forEach(System.out::println);//只要前两名System.out.println("=============================");scorce.stream().sorted((s1,s2)->Double.compare(s2,s1)).skip(2).forEach(System.out::println);//跳过前两名System.out.println("=============================");//如果希望自定义对象能够去重,需要重写对象的hashCode和equals方法才能去重scorce.stream().sorted((s1,s2)->Double.compare(s2,s1)).distinct().forEach(System.out::println);//去重//映射/加工方法: 把流上原本的数据拿出来变成新数据放回流上scorce.stream().map(s->"加十分后:"+(s+10)).forEach(System.out::println);//合并流Stream<String> s1 = Stream.of("张三丰", "张无忌", "张三");Stream<Integer> s2 = Stream.of(111,22,33);Stream<Object> s3 = Stream.concat(s1,s2);//每次只能合并两个System.out.println(s3.count());}
}
Stream流的常用终结方法
终结方法指的是调用完后不会返回新的Stream流了,不能再继续调用流了。
常用的一些终结方法有统计/收集方法。收集方法是将目前流中的数据存储到一个集合/数组中,统计方法是统计流中目前的元素数量,流中的最大值最小值等。
package streamDemo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@AllArgsConstructor
@NoArgsConstructor
@Data
public class Teacher implements Comparable<Teacher>{private String name;private int age;private double salary;@Overridepublic String toString(){return "Teacher{" +"name='" + name + '\'' +", age=" + age +", salary=" + salary +'}'+"\n";}//t2.compareTo(t1)//t2==this 比较者//t1==o 被比较者//规定:如果t2大于t1,返回正数;如果t2小于t1,返回负数;如果t2等于t1,返回0@Overridepublic int compareTo(Teacher o) {//按照年龄升序排序
// if (this.age>o.age)
// return 1;
// else if (this.age<o.age)
// return -1;
// return 0;
// }return this.age-o.age;//升序//return o.age-this.age;//降序}
}
package streamDemo;import java.util.*;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class StreamDemo4 {public static void main(String[] args) {//掌握Stream流的统计,收集操作(终结方法)List<Teacher> teachers = new ArrayList<>();teachers.add(new Teacher("张三",18,5000));teachers.add(new Teacher("老陈",38,8000));teachers.add(new Teacher("老金",58,15000));teachers.add(new Teacher("老魏",63,16000));teachers.add(new Teacher("张五",28,3500));teachers.stream().filter(s->s.getSalary()>6000).forEach(s-> System.out.println(s));System.out.println("======================================");long count = teachers.stream().filter(s -> s.getSalary() > 15000).count(); //计15000薪水以上的人数System.out.println(count);System.out.println("======================================");//获取薪水最高的老师对象Optional<Teacher> max = teachers.stream().max((t1, t2) -> Double.compare(t1.getSalary(), t2.getSalary()));Teacher maxTeacher = max.get();System.out.println(maxTeacher);//最小Optional<Teacher> min = teachers.stream().min((t1, t2) -> Double.compare(t1.getSalary(), t2.getSalary()));Teacher minTeacher = min.get();System.out.println(minTeacher);System.out.println("=====================================");List<String> list = new ArrayList<>();list.add("张无忌");list.add("周芷若");list.add("赵敏");list.add("张强");list.add("张无忌");list.add("张三丰");list.add("张小四");//收集到集合或数组中Stream<String> s1 = list.stream().filter(s->s.startsWith("张"));//收集到list集合//流只能收集一次List<String> List1 = s1.collect(Collectors.toList());System.out.println(List1);//收集到Set集合Set<String> list2 =list.stream().filter(s->s.startsWith("张")).collect(Collectors.toSet());System.out.println(list2);System.out.println("=============收集到map集合===================");Stream<Teacher> s4 = teachers.stream();//收集到Map集合:键是老师名称,值是老师薪水Map<String, Double> map = s4.collect(Collectors.toMap(t1 -> t1.getName(), t1 -> t1.getSalary()));System.out.println(map);}
}
以上就是关于Stream流的基本语法。
相关文章:
java加强 -stream流
Stream流是jdk8开始新增的一套api,可以用于操作集合或数组的内容。 Stream流大量的结合了Lambda的语法风格来编程,功能强大,性能高效,代码简洁,可读性好。 体验Stream流 把集合中所有以三开头并且三个字的元素存储到…...
Vue百日学习计划Day33-35天详细计划-Gemini版
总目标: 在 Day 33-35 理解 Vue 组件从创建到销毁的完整生命周期,熟练掌握 Composition API 中主要的生命周期钩子,并知道在不同阶段执行哪些操作。 所需资源: Vue 3 官方文档 (生命周期钩子): https://cn.vuejs.org/guide/essentials/lifecycle.html你…...

Linux(2)——shell原理及Linux中的权限
目录 一、shell的运行原理 二、Linux中权限的问题 1.权限的概念 2.如何进行用户的切换 1)从普通用户切到超级用户 2)从root用户切到普通用户 3.如何实现提权操作 4.如何将普通用户添加到信用列表(sudoers) 编辑5.Lin…...

如何在线免费压缩PDF文档?
PDF文件太大,通常是因为内部嵌入字体和图片。怎么才能将文件大小减减肥呢,主要有降低图片清晰度和去除相关字体两个方向来实现文档效果。接下来介绍三个免费压缩PDF实用工具。 (一)iLoveOFD在线转换工具 iLoveOFD在线转换工具&a…...
EasyExcel动态表头
专家官方解答 : 在使用EasyExcel处理Excel动态表头的问题时,官方并不推荐使用includecolumnfieldnames方法。根据提供的知识内容,以下是如何实现动态表头的详细步骤和解释: 原因分析 动态表头的需求通常来源于希望根据用户的选…...

汽车装配又又又升级,ethernetip转profinet进阶跃迁指南
1. 场景描述:汽车装配线中,使用EtherNet/IP协议的机器人与使用PROFINET协议的PLC进行数据交互。 2. 连接设备:EtherNet/IP机器人控制器(如ABB、FANUC)与PROFINET PLC(如西门子S7-1500)。 3. 连…...

css:无限滚动波浪线
以上是需要实现的效果,一条无限滚动波浪线,可以用来做区块的分割线。 要形成上下交替的圆形,思路是给div加圆角边框,第一个只有上边框,第二个只有下边框。 循环了100个div,这个数量根据自己容器宽度调整&…...
显示器无法接受键盘/鼠标问题解决
我们将键盘、鼠标的u盘插到显示器上后,仍然无法通过键盘和鼠标操控显示器是因为我们的显示器和笔记本/主机之间的连接只有一个typec对typec,无法满足信号传输 我们需要一根上行线:一头 typec/usb 接到主机/笔记本,然后另一头是 m…...

w~自动驾驶~合集3
我自己的原文哦~ https://blog.51cto.com/whaosoft/13269720 #FastOcc 推理更快、部署友好Occ算法来啦! 在自动驾驶系统当中,感知任务是整个自驾系统中至关重要的组成部分。感知任务的主要目标是使自动驾驶车辆能够理解和感知周围的环境元素&…...
<C++> MFC自动关闭对话框(MessageBoxTimeout)
MFC自动关闭对话框(MessageBoxTimeout) 记录一下今天在界面开发中的解决方案。自动关闭对话框有两种方案: 1.使用定时器实现延迟关闭(DeepSeek方案) 提示框显示几秒后自动关闭,可以使用 SetTimer KillT…...

山东大学计算机图形学期末复习整理5——CG10上
CG10上 Frenet-Serret框架 空间中一条曲线可以写成参数形式: C ( u ) ( x ( u ) , y ( u ) , z ( u ) ) \mathbf{C}(u) (x(u), y(u), z(u)) C(u)(x(u),y(u),z(u)) 这表示:当参数 u u u 变化时,曲线在三维空间中移动,生成一条轨…...

STM32移植LVGL8.3 (保姆级图文教程)
目录 前言设备清单2.8寸TFT-LCD屏原理与应用1️⃣基本参数2️⃣引脚说明3️⃣程序移植4️⃣硬件接线 LVGL8.3 移植流程1️⃣硬件及平台要求2️⃣版本说明3️⃣源码下载4️⃣源码移植 工程配置修改配置文件1️⃣lvgl_config.h2️⃣适配屏幕驱动3️⃣配置输入设备(触摸功能) 提供…...
AT 指令详解:基于 MCU 的通信控制实战指南AT 指令详解
在 MCU(单片机)项目中,我们经常需要与各种通信模组(GSM、Wi-Fi、蓝牙等)交互。而这类模组通常都通过串口(UART)与 MCU 通信,控制它们的“语言”就是——AT 指令。 一、什么是 AT 指…...

虚幻引擎5-Unreal Engine笔记之Default Pawn与GamMode、Camera的关系
虚幻引擎5-Unreal Engine笔记之Default Pawn与GamMode、Camera的关系 code review! 文章目录 虚幻引擎5-Unreal Engine笔记之Default Pawn与GamMode、Camera的关系1.Default Pawn与Camera的关系1.1. Default Pawn 是什么?1.2. Default Pawn 的主要组件1.3. Default…...

C++多态的详细讲解
【本节目标】 1. 多态的概念 2. 多态的定义及实现 3. 抽象类 4. 多态的原理 5. 单继承和多继承关系中的虚函数表 前言 需要声明的,本博客中的代码及解释都是在 vs2013 下的 x86 程序中,涉及的指针都是 4bytes 。 如果要其他平台下,部…...

vue项目启动报错
vue项目启动报错 一、问题二、解决 一、问题 从vue2更换到vue3之后,需要将node进行版本升级,之后启动项目出现了下面的问题。 Uncaught Error: A route named “PageNotFound” has been added as a child of a route with the same name. Route names …...
项目删除了,为什么vscode中的git还是存在未提交记录,应该怎么删除掉
Git的本地仓库(.git文件夹)可能仍然存在,即使项目文件已删除VSCode可能缓存了之前的Git状态Git的索引未被正确清理 解决方法: 彻底删除仓库: 确保完全删除项目文件夹及其中的.git目录或者在终端中执行 rm -rf .git&am…...

免费私有化部署! PawSQL社区版,超越EverSQL的企业级SQL优化工具面向个人开发者开放使用了
1. 概览 1.1 快速了解 PawSQL PawSQL是专注于数据库性能优化的企业级工具,解决方案覆盖SQL开发、测试、运维的整个流程,提供智能SQL审核、查询重写优化及自动化巡检功能,支持MySQL、PostgreSQL、Oracle、SQL Server等主流数据库及达梦、金仓…...

SecureCRT 使用指南:安装、设置与高效操作
目录 一、SecureCRT 简介 1.1 什么是 SecureCRT? 1.2 核心功能亮点 1.3 软件特点 二、SecureCRT 安装与激活 2.1 安装步骤(Windows 系统) 2.2 激活与破解(仅供学习参考) 三、基础配置与优化 3.1 界面与编码设…...

Tomcat多应用部署与静态资源路径问题全解指南
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…...
web常见的攻击方式
web攻击(webAttack)是针对用户上网行为或网站服务器等设备进行攻击的行为,如植入恶意代码、修改网站权限、获取网站用户隐私等等,即使是代码在的很小的bug也有可能导致隐私信息被泄漏,站点安全就是保护站点不受未授权的…...

【微信小程序 + 高德地图API 】键入关键字搜索地址,获取经纬度等
前言 又到熟悉的前言,接到个需求,要引入高德地图api,我就记录一下,要是有帮助记得点赞、收藏、关注😁。 后续有时间会慢慢完善一些文章:(画饼时间) map组件自定义气泡、mark标记点…...
java中如何优雅处理多租户系统的查询?
多租户系统通常是指一个应用服务多个客户(租户),每个租户的数据需要隔离,确保数据安全和隐私。处理这样的系统需要考虑数据隔离、查询效率、代码的可维护性等方面。 首先,我应该明确多租户的实现方式。常见的多租户数据…...

排序算法之线性时间排序:计数排序,基数排序,桶排序详解
排序算法之线性时间排序:计数排序、基数排序、桶排序详解 前言一、计数排序(Counting Sort)1.1 算法原理1.2 代码实现(Python)1.3 性能分析1.4 适用场景 二、基数排序(Radix Sort)2.1 算法原理2…...

Linux | mdadm 创建软 RAID
注:本文为 “Linux mdadm RAID” 相关文章合辑。 略作重排,未整理去重。 如有内容异常,请看原文。 Linux 下用 mdadm 创建软 RAID 以及避坑 喵ฅ・ﻌ・ฅ Oct 31, 2023 前言 linux 下组软 raid 用 mdadm 命令,multi…...
物联网工程毕业设计课题实践指南
1. 智能家居控制系统 1.1 基于ZigBee的智能家居控制 实践过程 硬件选型主控:CC2530/CC2531传感器:温湿度、光照、人体红外执行器:继电器、电机、LED灯系统架构 A[传感器层] --> B[ZigBee网络] B --> C[网关] C --> D[云平台] D --> E[手机APP] 开…...

CodeEdit:macOS上一款可以让Xcode退休的IDE
CodeEdit 是一款轻量级、原生构建的代码编辑器,完全免费且开源。它使用纯 swift 实现,而且专为 macOS 设计,旨在为开发者提供更高效、更可靠的编程环境,同时释放 Mac 的全部潜力。 Stars 数21,719Forks 数1,081 主要特点 macOS 原…...

LLaMA-Factory 微调 Qwen2-7B-Instruct
一、系统环境 使用的 autoDL 算力平台 1、下载基座模型 pip install -U huggingface_hub export HF_ENDPOINThttps://hf-mirror.com # (可选)配置 hf 国内镜像站huggingface-cli download --resume-download shenzhi-wang/Llama3-8B-Chinese-Chat -…...

mac本地docker镜像上传指定虚拟机
在Mac本地将Docker镜像上传至指定虚拟机的完整步骤 1. 在Mac本地保存Docker镜像为文件 通过docker save命令将镜像打包为.tar文件,便于传输至虚拟机。 # 示例:保存名为"my_image"的镜像到当前目录 docker save -o my_image.tar my_image:ta…...

从代码学习深度学习 - 风格迁移 PyTorch版
文章目录 前言方法 (Methodology)阅读内容和风格图像预处理和后处理抽取图像特征定义损失函数内容损失 (Content Loss)风格损失 (Style Loss)全变分损失 (Total Variation Loss)总损失函数初始化合成图像训练模型总结前言 大家好!欢迎来到我们的深度学习代码学习系列。今天,…...