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循环也可以用迭代器

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

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

相关文章

(附源码)springboot电影售票系统小程序 计算机毕设36991

目 录 摘要 1 绪论 1.1课题目的与意义 1.2研究背景 1.3论文结构与章节安排 1.4小程序框架以及目录结构介绍 2 springboot电影售票系统小程序系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 操作可行性分析 2.2 系统流程分析 2.2.1 数据…

Elasticsearch集群部署

服务器 安装软件主机名IP地址系统版本配置ElasticsearchElk10.3.145.14centos7.5.18042核4GElasticsearchEs110.3.145.57centos7.5.18042核3GElasticsearchEs210.3.145.57centos7.5.18042核3G 软件版本&#xff1a;elasticsearch-7.13.2.tar.gz 示例节点&#xff1a;10.3.145…

Redis分布式锁实现Redisson 15问

在一个分布式系统中&#xff0c;由于涉及到多个实例同时对同一个资源加锁的问题&#xff0c;像传统的synchronized、ReentrantLock等单进程情况加锁的api就不再适用&#xff0c;需要使用分布式锁来保证多服务实例之间加锁的安全性。常见的分布式锁的实现方式有zookeeper和redis…

文本编辑 UTF-8 BOM 中的BOM释义

参考资料 UTF8のBOM無しとBOM付きの違いBOMなしUTF-8によってWindowsでもたらされる困惑文字コードをUTF-8 BOMなし(UTF-8N)でファイル保存をする方法 目录 一. 前提二. BOM三. CSV文件中的表现 一. 前提 在使用Windows自带的记事本编辑.csv文件的时候&#xff0c;准备保存为…

Java 基础学习(一)Java环境搭建和基本数据类型

1 Java 开发环境搭建 1.1 Java 编程语言 1.1.1 什么是Java编程语言 语言是人类进行沟通交流的各种表达符号&#xff0c;方便人与人之间进行沟通与信息交换&#xff1b;而计算机编程语言则是人与计算机之间进行信息交流沟通的一种特殊语言&#xff0c;也有语法规则、字符、符…

kali linux英文改中文

如果英语基础较好的同学可以不用调整 反之则需要 找到终端&#xff08;就是输入命令的那个地方 如下&#xff09;点击它出现命令终端 切换为root用户&#xff0c;命令为&#xff1a; sudo dpkg-reconfigure locales 然后回车 找到这个zh_CN 然后回车 鼠标下键选中并且回车 输…

自动驾驶学习笔记(十一)——高精地图

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo Beta宣讲和线下沙龙》免费报名—>传送门 文章目录 前言 高精地图 地图采集 底图制作 地图…

HCIA-H12-811题目解析(1)

1、【多选题】关于动态 MAC 地址表说法正确的是&#xff1f; A、通过报文中的源MAC地址学习获得的动态MAC表项会老化 B、通过查看指定动态MAC地址表项的个数&#xff0c;可以获取接口下通信的用户数 C、在设备重启后&#xff0c;之前的动态表项会丢失 D、在设备重启后&…

Vue打包错误UnhandledPromiseRejectionWarning: CssSyntaxError

错误详情如下&#xff1a; building for production...Error processing file: static/css/app.3d5caae7aaba719754d7d5c30b864551.css (node:33011) UnhandledPromiseRejectionWarning: CssSyntaxError: /Users/yt/Documents/BM/sims-plus/sims-website/static/css/app.3d5caa…

基于PLC的果园灌溉系统设计(论文+源码)

1.系统设计 系统示意图如图2-1所示。某一果园 共有3个灌溉区域&#xff0c;分别为灌溉1#区&#xff0c;灌溉2#区&#xff0c;灌溉3#区&#xff0c;分别使用不同湿度传感器检测湿度&#xff0c;用于各区域控制湿度&#xff0c;进行灌溉&#xff0c;使用相应的灌溉阀进行灌溉。这…

2016年五一杯数学建模C题二孩政策问题解题全过程文档及程序

2016年五一杯数学建模 C题 二孩政策问题 原题再现 多年来实施的严、紧计划生育政策对控制人口增长起到关键作用。在优生优育政策的指引下&#xff0c;我国人口质量显著提高&#xff0c;但也带来了不利影响&#xff0c;生育率偏低、男女比例失衡、人口老龄化情况严重等问题。2…

BetaFlight模块设计之三十六:SoftSerial

BetaFlight模块设计之三十六&#xff1a;SoftSerial 1. 源由2. API接口2.1 openSoftSerial2.2 onSerialRxPinChange2.3 onSerialTimerOverflow2.4 processTxState2.5 processRxState 3. 辅助函数3.1 applyChangedBits3.2 extractAndStoreRxByte3.3 prepareForNextRxByte 4. 总结…

老师组织课外活动的好处有哪些

亲爱的小伙伴们&#xff0c;不知道你们有没有注意到&#xff0c;老师除了在课堂上教学之外&#xff0c;还会在课外组织各种各样的活动呢&#xff1f;这些活动不仅好玩&#xff0c;而且对我们有很多好处哦&#xff01;今天我就来给大家分享一下老师组织课外活动的好处吧&#xf…

geemap学习笔记014:加载本地的tif文件

前言 Colab中似乎没法直接加载云盘中的数据&#xff0c;但是可以先上传到GEE中的assets中&#xff0c;再加载本地的数据。下面是以这个数据为例进行展示。 1 上传数据 首先将本地的tif数据上传到Asset中&#xff0c;得到独一的Image ID。 2 加载数据 使用ee.Image加载数据 …

【腾讯云云上实验室】用向量数据库在金融信用数据库分析中的实战运用

一、前言 这篇文章将带领读者探索数据库的多样化解决方案及其演进历程&#xff0c;特别关注向量数据库的重要性和在实际项目中的应用。 通过深入剖析腾讯云向量数据库及其在金融信用数据库分析中的实战运用&#xff0c;为读者提供全面而实用的指南&#xff0c;帮助他们理解、…

【挑战业余一周拿证】一、亚马逊云科技简介 - 第 3 节 - 云计算

第 3 节 - 云计算 在深入了解亚马逊云科技的各个部分之前&#xff0c;让我们先缩小视野&#xff0c;对云进行一个合理的定义。云计算就是通过互联网按需提供 IT 资源并采用按需付费定价模式&#xff0c;下面&#xff0c;我们将进行详细说明。 按需提供表示的是亚马逊云科技会在…

箱型图 Box Plot 数据分析的法宝

文章目录 一、箱形图的介绍二、六大因数三、Box plot的应用四、箱形图的优劣势五、图形拓展 一、箱形图的介绍 箱形图又称为盒须图、盒式图、盒状图或箱线图&#xff0c;是一种用作显示一组数据分散情况资料的统计图。因型状如箱子而得名。 在各种领域也经常被使用&#xff0…

基于springboot实现医院信管系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现医院信管系统演示 摘要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#x…

C语言做一个恶作剧关机程序

一、项目介绍 C语言实现一个简单的"流氓软件"&#xff0c;一个可以强制关机恶作剧关机程序&#xff0c;输入指定指令可以解除 二、运行截图 然后当你输入“n”才可以解锁关机。 三、完整源码 #include <stdlib.h> #include <stdio.h> #include <s…

Java核心知识点整理大全17-笔记

Java核心知识点整理大全-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全2-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全3-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全4-笔记-CSDN博客 Java核心知识点整理大全5-笔记-CSDN博客 Java核心知识点整理大全6…