Java(七)(Lambda表达式,正则表达式,集合(Collection,Collection的遍历方式))
目录
Lambda表达式
省略写法(要看懂)
正则表达式
语法
案例
正则表达式的搜索替换和分割内容
集合进阶
集合体系结构
Collection
Collection的遍历方式
迭代器
增强for循环
Lambda表达式遍历Collection
List集合
ArrayList
LinkedList
哈希值
HashSet底层原理
LinkedHashSet底层原理
TreeSet
注意事项
并发修改异常(遍历的同时删除数据)
Lambda表达式
作用: 用于简化匿名内部类中的代码写法

函数式接口是啥?函数式接口首先是一个接口,其次它只有一个抽象类方法




再次强调一下Lambda表达式的写法:
我们只要匿名内部类中方法的()和里面的参数,然后加->,再加方法代码块中的内容
(参数,有就写,没有拉倒)->{代码块}
省略写法(要看懂)
(1)参数类型可以省略不写
(2)如果只有一个参数,参数类型可以省略不写,()也可以省略不写
(3)如果表达式只有一行代码的时候的时候:

方法引用 标志符号"::"
正则表达式
语法
public class test {public static void main(String[] args) {//需求: 检验QQ号码是否正确,要求全部是数字,长度是(6-20)之间,不能以0开头// 我们自己设计程序来校验
// System.out.println(checkQQ(null));
// System.out.println(checkQQ("1584878247"));
// System.out.println("-----------------------------");
// //正则表达式
// System.out.println(checkQQ("1584878247"));System.out.println("a".matches("[abc]")); // [abc]只能匹配a,b,cSystem.out.println("e".matches("[abcd]"));System.out.println("d".matches("[^abc]"));// [^abc]不能是a,b,cSystem.out.println("a".matches("[^abc]"));System.out.println("b".matches("[a-zA-Z]")); // [a-zA-Z]只能是a-z和A-ZSystem.out.println("2".matches("[a-zA-Z]"));System.out.println("k".matches("[a-z&&[^bc]]")); // a 到z,除了b和cSystem.out.println("b".matches("[a-z&&[^bc]]"));System.out.println("ab".matches("[a-zA-Z0-9]")); // false 上面的带[内容]的规则只能用于匹配单个字符// 2.预定义字符(只能匹配单个字符) . /d /D /s /S /w /WSystem.out.println("李".matches("."));System.out.println("李李".matches("."));// 在Java中,\是有特殊用途的,例如特殊字符\n \tSystem.out.println("1".matches("\\d"));System.out.println("12".matches("\\d"));System.out.println(" ".matches("\\s")); // \s:表示一个空白字符System.out.println("a".matches("\\s"));System.out.println("a".matches("\\S")); // \S表示一个非空字符System.out.println(" ".matches("\\S"));System.out.println("a".matches("\\w"));System.out.println("_".matches("\\w"));System.out.println("李".matches("\\w"));System.out.println("李".matches("\\W")); // \[^\w]不能是a-zA-Z_0-9System.out.println("a".matches("\\W"));System.out.println("2123".matches("\\d")); // 注意上面预定文字符都只能匹配单个字符// 3. 数量词 ? * + {n} {n,} {n,m}System.out.println("a".matches("\\w?")); // ?出现0次或1次System.out.println("".matches("\\w?")); // 出现0次System.out.println("abc12".matches("\\w*")); // *代表0次或多次System.out.println("".matches("\\w*")); // trueSystem.out.println("abc12".matches("\\w*")); //falseSystem.out.println("abc12".matches("\\w+")); // + 表示1次或者多次System.out.println("".matches("\\w+")); // falseSystem.out.println("abc12张".matches("\\w+")); // falseSystem.out.println("a3c".matches("\\w{3}")); // {3}表示正好是n次System.out.println("abcd".matches("\\w{3}")); // falseSystem.out.println("abcd".matches("\\w{3,}")); // {3,}表示>=3次System.out.println("ab".matches("\\w{3,}")); // false,ab出现了两次System.out.println("abcde李".matches("\\w{3,}")); // falseSystem.out.println("abcd12345".matches("\\w{3,9}"));// 其他几个常用的符号(?i)忽略大小写 或 : | 分组:()System.out.println("abc".matches("(?i)abc")); // trueSystem.out.println("ABC".matches("(?i)abc")); // trueSystem.out.println("aBc".matches("a((?i)b)c")); // trueSystem.out.println("ABc".matches("a((?i)b)c")); // true// 要么是3个小写字母 要么是3个数字System.out.println("123".matches(("\\d{3}|[a-z]{3}")));System.out.println("abc".matches("\\d{3}|[a-z]{3}"));System.out.println("aAc".matches("\\d{3}|[a-z]{3}"));System.out.println("我爱编程666666".matches("我爱(编程)+(666)+"));}
}
案例
public class zheng {public static void main(String[] args) {while (true) {System.out.println("请输入您的电话号码(手机|座机)");Scanner sc = new Scanner(System.in);String phone = sc.nextLine();if(phone.matches("(1[3-9]\\d{9})|(0\\d{2,7}(-)?[1-9]\\d{4,19})")) {System.out.println("格式正确");break;}else{System.out.println("输入不正确");}}}
}
public class zheng {public static void main(String[] args) {while (true) {System.out.println("请输入您的邮箱");Scanner sc = new Scanner(System.in);String phone = sc.nextLine();// 如果我们想用. ,前面要加转义字符if(phone.matches("\\w{2,}@\\w{2,10}(\\.\\w{2,9}){1,2}")) {System.out.println("格式正确");break;}else{System.out.println("输入不正确");}}}
}
public class zheng {
//爬取一段文本的信息public static void main(String[] args) {String data = "15234456782" +" 159632478@qq.com" +" 400-168-4568";// 1.定义爬取规则String regex = "(\\w{2,}@\\w{2,10}(\\.\\w{2,9}){1,2})|" +" (1[3-9]\\d{9})|(0\\d{2,7}(-)?[1-9]\\d{4,19})|"+"(400-?\\d{3,7}-?\\d{3,7})";// 2.把正则表达式封装成一个Pattern对象Pattern pattern = Pattern.compile(regex);// 3.通过pattern对象去获取查找内容的匹配器对象Matcher matcher = pattern.matcher(data);// 4.定义一个循环开始获取信息while (matcher.find()){String rs = matcher.group();System.out.println(rs);}}
}
正则表达式的搜索替换和分割内容

public class zheng {public static void main(String[] args) {String s1 = "古力娜扎1745236迪丽热巴5221李小谦";System.out.println(s1.replaceAll("\\w+","-"));String s2 = "我我我喜欢编编编编编程程";System.out.println(s2.replaceAll("(.)\\1+","$1"));String s3 = "古力娜扎1745236迪丽热巴5221李小谦";String[] names = s3.split("\\w+");System.out.println(names.toString());}
}
集合进阶
集合体系结构
Collection 单列集合: 每个元素(数据)只包含一个值
Map双列集合: 每个元素包含两个值(键值对)
Collection

强调一下上面的有序: 指的是,我们向一个集合中添加元素的时候,如果取出元素的顺序和我们添加的顺序一样的时候,这个时候叫有序

public class zheng {public static void main(String[] args) {Collection<String> c = new ArrayList<>(); //多态写法// 1.添加元素 , 添加成功返回truec.add("java1");c.add("java2");c.add("java1");c.add("java3");//2.清空集合的元素//c.clear();//System.out.println(c);//3.判断集合是否为空,是空返回trueSystem.out.println(c.isEmpty());// 4.返回大小System.out.println(c.size());//5.判断集合中是否包含某个元素System.out.println(c.contains("java1"));System.out.println(c.contains("java2"));//6.删除某个元素:如果有多个重复元素默认删除前面的第一个System.out.println(c.remove("java1"));System.out.println(c);// 7.把集合转换成数组Object[] arr = c.toArray();System.out.println(Arrays.toString(arr));// 8.将集合按照指定类型转成对应数据类型的数组String[] arr2 = c.toArray(new String[c.size()]);System.out.println(Arrays.toString(arr2));//9.把一个集合的全部数据拷贝倒入另一个集合中Collection<String>c1 = new ArrayList<>();c1.add("java1");c1.add("java2");Collection<String>c2 = new ArrayList<>();c2.add("java3");c2.add("java4");c1.addAll(c2);System.out.println(c1);//[java1, java2, java3, java4]System.out.println(c2);//[java3, java4]}
}
Collection的遍历方式
迭代器

public class zheng {public static void main(String[] args) {Collection<String> c = new ArrayList<>(); //多态写法// 1.添加元素 , 添加成功返回truec.add("java1");c.add("java2");c.add("java1");c.add("java3");Iterator<String> it = c.iterator();while(it.hasNext()){System.out.println(it.next());}}
}
增强for循环
可以用来遍历集合或者数组
for(元素的数据类型 变量名:数组或集合){
}
public class zheng {public static void main(String[] args) {Collection<String> c = new ArrayList<>(); //多态写法// 1.添加元素 , 添加成功返回truec.add("java1");c.add("java2");c.add("java1");c.add("java3");for(String ele:c){System.out.println(ele);}}
}
Lambda表达式遍历Collection
public class zheng {public static void main(String[] args) {Collection<String> c = new ArrayList<>(); //多态写法// 1.添加元素 , 添加成功返回truec.add("java1");c.add("java2");c.add("java4");c.add("java3");c.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}});System.out.println("***************************");// Lambda表达式进行简化代码c.forEach( s-> System.out.println(s));System.out.println("****************************");// 再进一步简化,方法引用c.forEach( System.out::println);}
}
集合中存贮的是元素的地址
List集合
public class zheng {public static void main(String[] args) {// 1.创建一个ArrayList集合对象(有序,可重复,有索引)List<String> list = new ArrayList<>(); // 这是一种多态的写法list.add("人上人");list.add("孙悟空");list.add("至尊宝");list.add("孙悟空");System.out.println(list);// 2.public void add(int index,E element): 在谋个索引位置插入元素list.add(2,"紫霞仙子");System.out.println(list);// 3. public E remove(int index) : 根据索引删除元素,返回插入元素System.out.println(list.remove(2));System.out.println(list);// 4.public E get (int index) : 返回集合中指定位置的元素System.out.println(list.get(3));// public E set(int index,E element): 修改索引位置处的元素,修改成功后返回原来的元素System.out.println(list.set(1,"牛魔王"));}
}
List集合的遍历
public class zheng {public static void main(String[] args) {// 1.创建一个ArrayList集合对象(有序,可重复,有索引)List<String> list = new ArrayList<>(); // 这是一种多态的写法list.add("人上人");list.add("孙悟空");list.add("至尊宝");list.add("孙悟空");// (1)for循环for (int i = 0; i < list.size(); i++) {String s = list.get(i);System.out.println(s);}System.out.println("****************");// (2)迭代器Iterator<String> it = list.iterator();while(it.hasNext()){System.out.println(it.next());}System.out.println("*****************");// 增强forfor (String s : list) {System.out.println(s);}System.out.println("*****************");// Lambda 表达式list.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}});}
}
ArrayList
有序,可重复,有索引
底层基于数组
希望记住元素的添加顺序,需要存储重复元素,又要频繁的根据索引查询数据
LinkedList
有序,可重复,有索引
底层基于双链表
希望记住元素的添加顺序,且增删首位数据的情况较多
哈希值
一个int类型的数值,Java中每个对象都有一个哈希值
Java中所有对象,都可以调用Object类提供的hashCode,返回该对象自己的哈希值
public int hashCode() 返回对象的hash值
对象哈希值的特点
同一个对象多次调用hashCode()方法返回的哈希值是相同的
不同对象,它们的哈希值一般是不相同的,但也有可能会相同(哈希碰撞)
HashSet底层原理
无序,不重复,无索引(无序指的是先加的元素不一定在前面)
基于哈希表
哈希表是一种增删改查数据
Hashset集合默认不能对内容一样的两个对象去重复,如果你想要对内容一样的两个对象进行去重,要重写hashCode和equals方法
LinkedHashSet底层原理
有序,不重复,无索引(有序指的是先加的元素一定在前面)
基于哈希表实现的,多了一个双链表机制记录前后元素的位置
TreeSet
不重复,无索引,可排序
基于红黑树实现的
Tree集合储存自定义对象时,必须指定排序规则,安置下面两种方法指定比较规则
(1)让自定义的类(如学生类)实现comparable接口,重写里面的compareTo方法来指定比较规则

(2)通过调用TreeSet集合有参数构造器,可以设置Comparator对象(比较器对象,用于指定比较规则)

这里的Comparator是一个接口,我们用匿名内部类作为实现类,将接口中的方法进行重写,就可以自定义排序规则了
注意事项
并发修改异常(遍历的同时删除数据)
使用迭代器遍历集合时,又同时在删除集合中的数据,程序就会并发修改异常的错误
public class zheng {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("王麻子");list.add("李小谦");list.add("李浴缸");list.add("李玉刚");list.add("鲤鱼杠");list.add("李於杠");
// Iterator<String> it = list.iterator();
// while(it.hasNext())
// {
// String name = it.next();
// if(name.contains("李")){
// // list.remove(it.next()); // 会出现并发修改错误
// it.remove(); // 删除迭代器当前遍历的数据,每删除一个数据后,相当于做了i--
// }
// }
// System.out.println(list);for (int i = 0; i < list.size(); i++) {String name = list.get(i);if(name.contains("李")){list.remove(name);i -- ;}}System.out.println(list);}
}
增强for循环和Lambda遍历的时候这个错误是不能修改的
还要注意到是,像set类的数据集合,不能取到索引是不能用for循环来遍历的,只能用迭代器来遍历集合,但是List集合可以用for循环也可以用迭代器
相关文章:
Java(七)(Lambda表达式,正则表达式,集合(Collection,Collection的遍历方式))
目录 Lambda表达式 省略写法(要看懂) 正则表达式 语法 案例 正则表达式的搜索替换和分割内容 集合进阶 集合体系结构 Collection Collection的遍历方式 迭代器 增强for循环 Lambda表达式遍历Collection List集合 ArrayList LinkedList 哈希值 HashSet底层原理 …...
华为OD机试 - 二叉树计算(Java JS Python C)
目录 题目描述 输入描述 输出描述 用例 题目解析 JS算法源码 Java算法源码...
鸿蒙(HarmonyOS)应用开发——基础组件
组件 组件化是一种将复杂的前端应用程序分解成小的、独立的部分的方法。这些部分被称为组件,它们可以重复使用,可以与其他组件组合使用以创建更复杂的组件,并且它们有自己的生命周期和状态。 组件化的目的是提高开发效率和代码重用率&#…...
Vue3的项目创建到启动
Vue3的项目创建 检查node版本创建 npm init vuelatest 安装依赖 项目启动 启动成功...
开关电源基础而又硬核的知识
1.什么是Power Supply? Power Supply是一种提供电力能源的设备,它可以将一种电力能源形式转换成另外一种电力能源形式,并能对其进行控制和调节。 根据转换的形式分类:AC/DC、DC/DC、DC/AC、AC/AC 根据转换的方法分类:线性电源、…...
LightDB23.4 支持转换sql中中文空格和逗号为英文空格和逗号
功能介绍 在Lightdb数据库兼容Oracle的语法时,发现Oracle支持sql语句中使用中文空格和中文逗号,为了方便用户迁移到Lightdb,在Lightdb23.4版本中支持了转换中文空格和逗号的功能。该功能由GUC参数lightdb_convert_chinese_char来控制开关&am…...
EM@常见平面曲线的方程的不同表示方式
文章目录 abstract常见曲线的不同形式小结:一览表分析圆锥曲线的极坐标方程非标准位置的圆锥曲线参数方程应用比较 refs abstract 常见平面曲线的方程的不同表示方式 常见曲线的不同形式 下面以平面曲线为对象讨论参数方程通常是对普通方程的补充和增强,曲线的普通方程(直角…...
element使用小结
1、tabel表头文字自定义效果(换行,不同颜色) 换行: // 方法一 <el-table-columnprop"otherCost":label"本期累计\n(元)"> // 通过:label添加\n </el-table-column>.xx .cell {white-space: pre-…...
自动驾驶DCLC 功能规范
目录 1 概述Summary....................................................................................................... 4 1.1 目的Purpose....................................................................................................... 4 1.2 范围Ran…...
LabVIEW中将SMU信号连接到PXI背板触发线
LabVIEW中将SMU信号连接到PXI背板触发线 本文介绍如何将信号从PXI(e)SMU卡路由到PXI(e)机箱上的背板触发线。该过程涉及使用NI-DCPowerVI将SMU信号导出到PXI_TRIG线上。 在继续操作之前,请确保在开发PC上安装了兼容版…...
[蓝桥杯习题]———位运算、判断二进制1个数
⭐Hello!这里是欧_aita的博客。 ⭐今日语录:行动胜过一切。 ⭐个人主页:欧_aita ψ(._. )>⭐个人专栏: 数据结构与算法(内含蓝桥杯习题) MySQL数据库 位运算 位运算位运算的定义简单运用 实战刷题题目思路代码实现声…...
3DCAT为华东师大设计学院打造元宇宙数字虚拟学院
6月11日,华东师范大学设计学院在chi K11美术馆举办了一场别开生面的 2023 年本科毕业设计暨项目实践教学现场演示展。其中,元宇宙数字虚拟学院(一期)的现场发布会引起了现场震撼,吸引了众多观众的目光和参与。 该元宇宙…...
AIGC 3D即将爆发,混合显示成为产业数字化的生产力平台
2023年,大语言模型与生成式AI浪潮席卷全球,以文字和2D图像生成为代表的AIGC正在全面刷新产业数字化。而容易为市场所忽略的是,3D图像生成正在成为下一个AIGC风口,AIGC 3D宇宙即将爆发。所谓AIGC 3D宇宙,即由文本生成3D…...
时间序列预测实战(二十一)PyTorch实现TCN卷积进行时间序列预测(专为新手编写的自研架构)
一、本文介绍 本篇文章给大家带来的是利用我个人编写的架构进行TCN时间序列卷积进行时间序列建模(专门为了时间序列领域新人编写的架构,简单不同于市面上大家用GPT写的代码),包括结果可视化、支持单元预测、多元预测、模型拟合效…...
探索计算机视觉:深度学习与图像识别的融合
探索计算机视觉:深度学习与图像识别的融合 摘 要: 本文将探讨计算机视觉领域中的深度学习技术,并重点关注图像识别方面的应用。我们将介绍卷积神经网络(CNN)的原理、常用的图像数据集以及图像识别的实际应用场景&…...
屏蔽WordPress评论中长URL地址方法
由于WordPress是比较常见的CMS程序之一,所以很多网络营销推广也会基于WP去群发外链和广告信息。这里,我们可以通过屏蔽特定关键字、屏蔽特定字符的方式,或者是屏蔽评论内容的长短来限制评论。还有一个我们可以通过评论内容的URL地址的长度来屏…...
【教程】 一文部署配置并入门 Redis
综述 什么是Redis Redis官网——Redis.io Redis, 作为一个高性能的键值对数据库,主要应用于以下场景: 缓存系统:由于其高速读写能力,Redis 非常适合用作缓存系统,减少数据库负载。 会话存储(Session St…...
数据被锁住了?如何应对.mkp病毒的攻击
导言: 在数字时代的舞台上,.mkp勒索病毒如幽灵般悄然崭露头角,威胁着无数个体和组织的数据安全。本文将深度挖掘.mkp勒索病毒的狡猾本质,并为你揭示应对感染的独特方法,以及如何巧妙规避这个数字威胁。 如果您在面对被…...
【Shell】Shell基础学习
一、shell脚本 (1)第一个shell脚本 #!/bin/bash #this is a comment echo "hello world"一个shell脚本永远以“#!”开头,这是一个脚本开始的标记,它是告诉系统执行这个文件需要用某个解释器,后面的/bin/bash就是指明解释器的具体位置。 “#”开头是注释 …...
python文件读取
相对路径 读文件 打印txt文件 fopen(".\data.txt","r",encoding"utf-8") contentf.read() print(content) f.close()with open(".\data.txt","r",encoding"utf-8") as f:contentf.read()print(content)contentf…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
