Java(七)(Lambda表达式,正则表达式,集合(Collection,Collection的遍历方式))

news2024/11/28 7:28:19

目录

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,c
        System.out.println("e".matches("[abcd]"));

        System.out.println("d".matches("[^abc]"));// [^abc]不能是a,b,c
        System.out.println("a".matches("[^abc]"));

        System.out.println("b".matches("[a-zA-Z]")); // [a-zA-Z]只能是a-z和A-Z
        System.out.println("2".matches("[a-zA-Z]"));

        System.out.println("k".matches("[a-z&&[^bc]]")); //  a 到z,除了b和c
        System.out.println("b".matches("[a-z&&[^bc]]"));

        System.out.println("ab".matches("[a-zA-Z0-9]")); // false 上面的带[内容]的规则只能用于匹配单个字符

        // 2.预定义字符(只能匹配单个字符)   .   /d  /D  /s  /S  /w  /W
        System.out.println("李".matches("."));
        System.out.println("李李".matches("."));

        // 在Java中,\是有特殊用途的,例如特殊字符\n \t

        System.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-9
        System.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*"));  // true
        System.out.println("abc12".matches("\\w*")); //false

        System.out.println("abc12".matches("\\w+"));  // + 表示1次或者多次
        System.out.println("".matches("\\w+")); // false
        System.out.println("abc12张".matches("\\w+")); // false

        System.out.println("a3c".matches("\\w{3}"));  // {3}表示正好是n次
        System.out.println("abcd".matches("\\w{3}")); // false
        System.out.println("abcd".matches("\\w{3,}"));  // {3,}表示>=3次
        System.out.println("ab".matches("\\w{3,}"));  // false,ab出现了两次
        System.out.println("abcde李".matches("\\w{3,}")); // false
        System.out.println("abcd12345".matches("\\w{3,9}"));

         // 其他几个常用的符号(?i)忽略大小写  或 : |  分组:()
        System.out.println("abc".matches("(?i)abc"));  // true
        System.out.println("ABC".matches("(?i)abc"));  // true
        System.out.println("aBc".matches("a((?i)b)c"));  // true
        System.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.添加元素 , 添加成功返回true
        c.add("java1");
        c.add("java2");
        c.add("java1");
        c.add("java3");

        //2.清空集合的元素
        //c.clear();
        //System.out.println(c);

        //3.判断集合是否为空,是空返回true
        System.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.添加元素 , 添加成功返回true
        c.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.添加元素 , 添加成功返回true
        c.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.添加元素 , 添加成功返回true
        c.add("java1");
        c.add("java2");
        c.add("java4");
        c.add("java3");

        c.forEach(new Consumer<String>() {
            @Override
            public 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("*****************");

        // 增强for
        for (String s : list) {
            System.out.println(s);
        }
        System.out.println("*****************");

        // Lambda 表达式
        list.forEach(new Consumer<String>() {
            @Override
            public 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.coloradmin.cn/o/1254390.html

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

相关文章

ArcGIS中基于人口数据计算人口密度的方法

文章目录 一、密度分析原理二、点密度分析三、线密度分析四、核密度分析一、密度分析原理 密度分析是指根据输入的要素数据集计算整个区域的数据聚集状况,从而产生一个联系的密度表面。通过密度计算,将每个采样点的值散步到整个研究区域,并获得输出栅格中每个像元的密度值。…

R语言实现Lasso回归

一、Lasso回归 Lasso 回归&#xff08;Least Absolute Shrinkage and Selection Operator Regression&#xff09;是一种用于线性回归和特征选择的统计方法。它在回归问题中加入了L1正则化项&#xff0c;有助于解决多重共线性&#xff08;多个特征高度相关&#xff09;和特征选…

Java中有几种基本数据类型以及转换方式【Java面经(1)】

问&#xff1a;Java中有几种基本数据类型呢&#xff1f;以及它们之间的转换方式。详细介绍下 总共有8种基本数据类型 byte 、short 、long 、float 、double 、boolean 、char 详细类型以及字节数&#xff1a; 基本数据类型的转换方式 自动类型转换&#xff1a;小–>大 byt…

Vue快速实践总结 · 上篇

文章目录 模板语法数据绑定事件处理计算属性监视属性&#xff08;监听器&#xff09;条件渲染列表渲染数据监视原理内置指令总结生命周期组件化编程组件使用步骤组件的嵌套this指向单文件组件ref、props 脚手架(Vue CLI)render函数 参考自己的Vue专栏以及Vue官方文档 模板语法 …

stm32 42步进电机 上位机示例

脉冲到底是个啥东西&#xff1f;步进电机一直说发脉冲 步进电机通过接收脉冲信号来实现精确的位置控制。脉冲是一种短暂的电信号&#xff0c;它的变化可以触发步进电机转动一定的角度或步进。步进电机控制系统会根据输入的脉冲信号来精确定位和控制步进电机的转动&#xff0c;每…

Android平台GB28181设备接入模块开发填坑指南

技术背景 为什么要开发Android平台GB28181设备接入模块&#xff1f;这个问题不再赘述&#xff0c;在做Android平台GB28181客户端的时候&#xff0c;媒体数据这块&#xff0c;我们已经有了很好的积累&#xff0c;因为在此之前&#xff0c;我们就开发了非常成熟的RTMP推送、轻量…

rsyslog出现Unit rsyslog.service is masked不可用问题解决

博主在测试将日志发送到日志服务器的功能时遇到了rsyslog服务不可用的问题&#xff0c;具体来说&#xff0c;就是执行systemctl restart rsyslog或者 service rsyslog restart命令时&#xff0c;出现了标题中所述的Unit rsyslog.service is masked问题。网上查找了很多资料&…

云服务器上部署 Web 项目及端口异常处理

文章目录 1. 在云服务器的 MySQL(MariaDB) 中, 建库建表2. 微调代码3. 打包4. 把 war 包 拷贝到云服务器上端口被占用处理 1. 在云服务器的 MySQL(MariaDB) 中, 建库建表 在云服务器中进入 MySQL mysql -u root -p把之前本地写好的 SQL 代码一粘贴即可 例如: -- 这个文件主要…

【Python】用三种方法创建tkinter桌面窗口

Python的tkinter是Python的标准GUI库之一&#xff0c;它是一个开源的、跨平台的GUI工具包&#xff0c;可以用于创建桌面应用程序。 tkinter提供了许多常见的GUI组件&#xff0c;例如按钮、文本框、标签、列表框等等&#xff0c;可以轻松地创建各种类型的桌面应用程序。它还支持…

go atexit源码分析

文章目录 atexit源码解析UML类图样例一: 程序退出之前执行注册函数1.1 流程图1.2 代码分析 样例二&#xff1a;使用cancel取消注册函数2.1 cancel流程图2.2 代码分析 样例三&#xff1a;使用Fatal/Fatalln/Fatal执行注册函数3.1 Fatal/Fatalln/Fatal流程图3.2 代码分析 atexit源…

什么是LASSO回归,怎么看懂LASSO回归的结果

随着机器学习的发展&#xff0c;越来越多SCI文章都使用了更多有趣、高效的统计方法来进行分析&#xff0c;LASSO回归就是其中之一。很多小伙伴听说过LASSO&#xff0c;但是对于LASSO是什么&#xff0c;有什么用&#xff0c;怎么才能实现&#xff0c;大家可能一头雾水。今天的文…

每日一题2023.11.26——个位数统计【PTA】

题目要求&#xff1a; 输入格式&#xff1a; 每个输入包含 1 个测试用例&#xff0c;即一个不超过 1000 位的正整数 N。 输出格式&#xff1a; 对 N 中每一种不同的个位数字&#xff0c;以 D:M 的格式在一行中输出该位数字 D 及其在 N 中出现的次数 M。要求按 D 的升序输出。…

【华为数通HCIP | 网络工程师】821-IGP高频题、易错题之OSPF(7)

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

blender 3D眼球结构

角膜&#xff08;Cornea&#xff09;&#xff1a;眼球的前部&#xff0c;透明的曲面&#xff0c;负责折射光线。虹膜&#xff08;Iris&#xff09;&#xff1a;眼睛的颜色部分&#xff0c;控制瞳孔大小以调整进入眼睛的光量。瞳孔&#xff08;Pupil&#xff09;&#xff1a;虹膜…

S25FL系列FLASH读写的FPGA实现

文章目录 实现思路具体实现子模块实现top模块 测试Something 实现思路 建议读者先对 S25FL-S 系列 FLASH 进行了解&#xff0c;我之前的博文中有详细介绍。 笔者的芯片具体型号为 S25FL256SAGNFI00&#xff0c;存储容量 256Mb&#xff0c;增强高性能 EHPLC&#xff0c;4KB 与 6…

快速幂算法详解(C++实现)

文章目录 1. 什么是快速幂2. 暴力求解代码实现缺陷分析 3. 优化一&#xff1a;取模运算的性质4. 优化二&#xff1a;快速幂算法的核心思想5. 终极优化&#xff1a;位运算优化6. 源码 这篇文章我们来一起学习一个算法——快速幂算法。 1. 什么是快速幂 顾名思义&#xff0c;快速…

中海油“海安杯”一站到底知识竞赛真的很有特色

中海油“海安杯”一站到底知识竞赛规格高&#xff0c;赛制复杂&#xff0c;天纵知识竞赛系统为此次知识竞赛提供了软件支持。本次竞赛设置选手区和擂台区两个区域。比赛共分为五个轮次&#xff0c;五个轮次选手区所有参赛选手均需答题。 第一轮&#xff1a;“脱颖而出” 所有参…

叠加原理(superposition principle)

叠加原理&#xff08;superposition principle&#xff09;指对线性系统而言&#xff0c;两个或多个输入产生的输出&#xff0c;等于这几个输入单独引起的输出的和&#xff0c;即输入的叠加等于各输入单独引起的输出的叠加。 例如&#xff0c;如果输入产生的输出是&#xff0c;…

B树与B+树的对比

B树&#xff1a; m阶B树的核心特性&#xff1a; 树中每个节点至多有m棵子树&#xff0c;即至多含有m-1个关键字根节点的子树数属于[2, m]&#xff0c;关键字数属于[1, m-1]&#xff0c;其他节点的子树数属于 [ ⌈ m 2 ⌉ , m ] [\lceil \frac{m}{2}\rceil, m] [⌈2m​⌉,m]&am…

Spring的依赖注入,依赖注入的基本原则,依赖注入的优势

文章目录 Spring的依赖注入依赖注入的基本原则依赖注入有什么优势查找定位操作与应用代码完全无关。有哪些不同类型的依赖注入实现方式&#xff1f;构造器依赖注入和 Setter方法注入的区别 Spring的依赖注入 控制反转IoC是一个很大的概念&#xff0c;可以用不同的方式来实现。…