JavaSE(Lombok、枚举、JDK8新特性、正则表达式)

Lombok

Lombok的使用

lombok介绍:

  • lombok可以使用注解的方式让一些代码变的简洁 方便
  • 实体类中有一些固定的代码:构造方法,getter/setter、equals、hashcode、toString方法都是固定的,写出来看着比较麻烦。而Lombok能通过注解的方式,在编译时自动为属性生成这些代码。

lombok使用:

​ 1. 添加lombok的jar包:

将lombok.jar(本例使用版本:1.18.10),添加到模块目录下,并添加到ClassPath

​ 2. 为IDEA添加lombok插件(**连接网络使用)

安装完毕后,重启IDEA。

lombok常用注解

  • @Getter和@Setter

    • 作用:生成成员变量的get和set方法。
    • 写在成员变量上,指对当前成员变量有效。
    • 写在类上,对所有成员变量有效。
    • 注意:静态成员变量无效。
  • @ToString:

    • 作用:生成toString()方法。
    • 该注解只能写在类上。
  • @NoArgsConstructor和@AllArgsConstructor

    • @NoArgsConstructor:无参数构造方法。
    • @AllArgsConstructor:满参数构造方法。
    • 注解只能写在类上。
  • @EqualsAndHashCode

    • 作用:生成hashCode()和equals()方法。
    • 注解只能写在类上。
  • @Data

    • 作用: 生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。

    • 注解只能写在类上。

枚举

枚举的概述和定义

不使用枚举存在的问题

假设要定义一个人类,人类中包含姓名和性别。通常会将性别定义成字符串类型,效果如下:

public class Person {
    private String name;
    private String sex;

    public Person() {
    }

    public Person(String name, String sex) {
        this.name = name;
        this.sex = sex;
    }
	
    // 省略get/set/toString方法
}
public class Demo01 {
    public static void main(String[] args) {
        Person p1 = new Person("小明", "男");
        Person p2 = new Person("小明", "abc"); // 因为性别是字符串,所以我们可以传入任意字符串
    }
}

不使用枚举存在的问题:可以给性别传入任意的字符串,导致性别是非法的数据,不安全。

枚举的概念

枚举是一种引用数据类型,java中的枚举是有固定个数对象的"特殊类"。如果有些类的对象是固定个数的,就可以定义成枚举。比如性别、季节、方向。

定义枚举的格式

public enum 枚举名 {
    // 第一行都是罗列枚举实例,这些枚举实例直接写大写名字即可。
    实例,实例,实例,...}

public enum Sex {
   BOY, GIRL; 
}

public enum Season {
    SPRING, SUMMER, AUTUMN, WINTER;
}

public enum Direction{ 
    UP, RIGHT, DOWN, LEFT;
}

枚举的使用

  1. 定义枚举:BOY表示男,GIRL表示女
enum Sex {
    BOY, GIRL; // 男,女
}
  1. Perosn中的性别有String类型改为Sex枚举类型
public class Person {
    private String name;
    private Sex sex;

    public Person() {
    }

    public Person(String name, Sex sex) {
        this.name = name;
        this.sex = sex;
    }
    // 省略get/set/toString方法
}
  1. 使用是只能传入枚举中的固定值
public class Demo02 {
    public static void main(String[] args) {
        // 使用枚举格式: 枚举类型.枚举值
        Person p1 = new Person("小明", Sex.BOY);
        Person p2 = new Person("小明", Sex.GIRL);
        Person p3 = new Person("小明", "abc");// 编译报错
    }
}

枚举的其他内容

枚举的本质是一个类,所以枚举中还可以有成员变量,成员方法等。

枚举的本质是一个类,我们刚才定义的Sex枚举最终效果如下:

public enum Sex {
    BOY, GIRL; // 男,女
}
public enum Sex {
    BOY(18), GIRL(16);

    public int age;

    Sex(int age) {
        this.age = age;
    }

    public void showAge() {
        System.out.println("年龄是: " + age);
    }
}
public class Demo03 {
    public static void main(String[] args) {
        Person p1 = new Person("小明", Sex.BOY);
        Person p2 = new Person("小明", Sex.GIRL);

        Sex.BOY.showAge();
        Sex.GIRL.showAge();
    }
}

运行效果:
在这里插入图片描述

JDK8新特性

方法引用

方法引用概述

  • 方法引用使用一对冒号 :: , 方法引用就是用来在一定的情况下,替换Lambda表达式

方法引用基本使用

  • 使用场景:
    • 如果一个Lambda表达式大括号中的代码和另一个方法中的代码一模一样,那么就可以使用方法引用把该方法引过来,从而替换Lambda表达式
    • 如果一个Lambda表达式大括号中的代码就是调用另一方法,那么就可以使用方法引用把该方法引过来,从而替换Lambda表达式
public class Demo {

    public static void printStr(){
        System.out.println("任务执行了...");
    }

    public static void main(String[] args) {
        // 创建线程并启动线程
        // 1.匿名内部类的方式
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("任务执行了...");
            }
        }).start();

        // 2.Lambda表达式的方式
        new Thread(()->{System.out.println("任务执行了...");}).start();// 这个Lambda表达式大括号中的代码和Demo类的printStr()方法一模一样,符合方法引用替换Lambda表达式的场景

        new Thread(()->{Demo.printStr();}).start();// 这个Lambda表达的大括号中其实就是调用Demo类的printStr()方法,符合方法引用替换Lambda表达式的场景
        
	    // 3.方法引用的方式:
        new Thread(Demo::printStr).start();
    }
}

方法引用的分类

构造方法引用

public class Test2 {
    public static void main(String[] args) {
        //创建集合
        ArrayList<String> list = new ArrayList<>();
        list.add("小明");
        list.add("小红");
        list.add("小白");

        // 需求: 把集合中的元素转换为Person对象,打印输出
        list.stream().map(s-> new Person(s)).forEach(s-> System.out.println(s));

        System.out.println("======================");
       
        list.stream().map(Person::new).forEach(s-> System.out.println(s));
	
    }
}

静态方法引用

public class Test2 {
    public static void main(String[] args) {
        //创建集合
        ArrayList<String> list = new ArrayList<>();
        list.add("110");
        list.add("111");
        list.add("112");

        // 需求:把集合中的元素转换为int类型,打印输出
        list.stream().map(s-> Integer.parseInt(s)).forEach(s-> System.out.println(s));

        System.out.println("======================");

        list.stream().map(Integer::parseInt).forEach(s-> System.out.println(s));

    }
}

对象成员方法引用

  • 成员方法有参数

    public class Test2 {
        public static void main(String[] args) {
            //创建集合
            ArrayList<String> list = new ArrayList<>();
            list.add("小明");
            list.add("小红");
            list.add("小白");
    
            // 需求:把集合中所有元素打印输出
            list.stream().forEach(s-> System.out.println(s));
    
            System.out.println("=================================");
            
            list.stream().forEach(System.out::println);
    
        }
    }
    

类的成员方法引用

  • 成员方法没有参数
    public class Test2 {
        public static void main(String[] args) {
            //创建集合
            ArrayList<String> list = new ArrayList<>();
            list.add("小明");
            list.add("小红");
            list.add("小白");
    
            // 需求: 把集合中的元素转换为该元素对应的字符长度,打印输出
            list.stream().map(s->s.length()).forEach(System.out::println);
    
            System.out.println("=================================");
    		//会默认的用参数s去调用String类中的length()方法
            list.stream().map(String::length).forEach(System.out::println);
    
        }
    }
    

Base64

Base64概述

  • Base64是jdk8提出的一个新特性,可以用来进行按照一定规则编码和解码

Base64编码和解码的相关方法

  • 编码的步骤:

    • 获取编码器
    • 调用方法进行编码
  • 解码步骤:

    • 获取解码器
    • 调用方法进行解码
  • Base64工具类提供了一套静态方法获取下面三种BASE64编解码器:

    • **基本:**输出被映射到一组字符A-Za-z0-9+/,编码不添加任何行标,输出的解码仅支持A-Za-z0-9+/。
    • **URL:**输出映射到一组字符A-Za-z0-9+_,输出是URL和文件。
    • **MIME:**输出隐射到MIME友好格式。输出每行不超过76字符,并且使用’\r’并跟随’\n’作为分割。编码输出最后没有行分割。
  • 获取编码器和解码器的方法

    static Base64.Decoder getDecoder() 基本型 base64 解码器。
    static Base64.Encoder getEncoder() 基本型 base64 编码器。
    
    static Base64.Decoder getMimeDecoder() Mime型 base64 解码器。
    static Base64.Encoder getMimeEncoder() Mime型 base64 编码器。
    
    static Base64.Decoder getUrlDecoder() Url型 base64 解码器。
    static Base64.Encoder getUrlEncoder() Url型 base64 编码器。
    
  • 编码和解码的方法:

    Encoder编码器:  encodeToString(byte[] bys)编码
    Decoder解码器:  decode(String str) 解码
    

案例演示

  • 基本
public class Test1 {
    public static void main(String[] args) {
        // 使用基本型的编码器和解码器对数据进行编码和解码:
        // 1.获取编码器
        Base64.Encoder encoder = Base64.getEncoder();

        // 2.对字符串进行编码
        String str = "name=xx?password=123456";
        String str1 = encoder.encodeToString(str.getBytes());

        // 3.打印输出编码后的字符串
        System.out.println("编码后的字符串:"+str1);

        // 4.获取解码器
        Base64.Decoder decoder = Base64.getDecoder();

        // 5.对编码后的字符串进行解码
        byte[] bys = decoder.decode(str1);
        String str2 = new String(bys);

        // 6.打印输出解码后的字符串
        System.out.println("解码后的字符串:"+str2);
    }
}
  • URL
public class Test2 {
    public static void main(String[] args) {

        // 使用URL型的编码器和解码器对数据进行编码和解码:
        // 1.获取编码器
        Base64.Encoder encoder = Base64.getUrlEncoder();

        // 2.对字符串进行编码
        String str = "name=xx?password=123456";
        String str1 = encoder.encodeToString(str.getBytes());

        // 3.打印输出编码后的字符串
        System.out.println("编码后的字符串:"+str1);

        // 4.获取解码器
        Base64.Decoder decoder = Base64.getUrlDecoder();

        // 5.对编码后的字符串进行解码
        byte[] bys = decoder.decode(str1);
        String str2 = new String(bys);

        // 6.打印输出解码后的字符串
        System.out.println("解码后的字符串:"+str2);
    }
}
  • MIME
public class Test3 {
    public static void main(String[] args) {
        // 使用MIME型的编码器和解码器对数据进行编码和解码:
        // 1.获取编码器
        Base64.Encoder encoder = Base64.getMimeEncoder();

        // 2.对字符串进行编码
        String str = "";
        for (int i = 0; i < 100; i++) {
            str += i;
        }
        System.out.println("编码前的字符串:"+str);

        String str1 = encoder.encodeToString(str.getBytes());

        // 3.打印输出编码后的字符串
        System.out.println("编码后的字符串:"+str1);

        // 4.获取解码器
        Base64.Decoder decoder = Base64.getMimeDecoder();

        // 5.对编码后的字符串进行解码
        byte[] bys = decoder.decode(str1);
        String str2 = new String(bys);

        // 6.打印输出解码后的字符串
        System.out.println("解码后的字符串:"+str2);
    }
}

正则表达式

正则表达式的概念及演示

  • 概述:正则表达式其实就是一个匹配规则,用来替换之前复杂的if结构判断

  • 在Java中,经常需要验证一些字符串,是否符合规则,例如:校验qq号码是否正确,手机号码是否正确,邮箱是否正确等等。那么如果使用if就会很麻烦,而正则表达式就是用来验证各种字符串的规则。它内部描述了一些规则,可以验证用户输入的字符串是否匹配这个规则。

  • 先看一个不使用正则表达式验证的例子:下面的程序让用户输入一个QQ号码,我们要验证:

    • QQ号码必须是5–15位长度
    • 而且必须全部是数字
    • 而且首位不能为0
public class Demo {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.println("请输入你的QQ号码:");
		String qq = sc.next();
		
		System.out.println(checkQQ(qq));
	}
	//自己编写代码,验证QQ号码
	private static boolean checkQQ(String qq) {
		//1.验证5--15位
		if(qq.length() < 5 || qq.length() > 15){
			return false;
		}
		//2.必须都是数字;
		for(int i = 0;i < qq.length() ; i++){
			char c = qq.charAt(i);
			if(c < '0' || c > '9'){
				return false;
			}
		}
		//3.首位不能是0;
		char c = qq.charAt(0);
		if(c == '0'){
			return false;
		}
		return true;//验证通过
	}
	
}
  • 使用正则表达式验证:
public class Demo {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.println("请输入你的QQ号码:");
		String qq = sc.next();
		
		System.out.println(checkQQ2(qq));
	}
	//使用正则表达式验证
	private static boolean checkQQ2(String qq){
		String regex = "[1-9]\\d{4,14}";//正则表达式
		return qq.matches(regex);
	}
}

上面程序checkQQ2()方法中String类型的变量regex就存储了一个"正则表达式 ",而这个正则表达式就描述了需要的三个规则。matches()方法是String类的一个方法,用于接收一个正则表达式,并将"本对象"与参数"正则表达式"进行匹配,如果本对象符合正则表达式的规则,则返回true,否则返回false。

正则表达式的基本使用

正则表达式-字符类

  • 语法示例:[] 表示匹配单个字符 ^ 取反 - 范围

    1. [abc]:代表a或者b,或者c字符中的一个。
    2. [^abc]:代表除a,b,c以外的任何字符。
    3. [a-z]:代表a-z的所有小写字符中的一个。 左右包含
    4. [A-Z]:代表A-Z的所有大写字符中的一个。
    5. [0-9]:代表0-9之间的某一个数字字符。
    6. [a-zA-Z0-9]:代表a-z或者A-Z或者0-9之间的任意一个字符。
    7. [a-dm-p]:a 到 d 或 m 到 p之间的任意一个字符。
  • 代码示例:

public class Test1 {
    public static void main(String[] args) {
        String str = "ead";
        //1.验证str是否以h开头,以d结尾,中间是a,e,i,o,u中某个字符
        System.out.println(str.matches("h[aeiou]d"));// false
        System.out.println("hed".matches("h[aeiou]d"));// true
        System.out.println("heod".matches("h[aeiou]d"));// false
        System.out.println("==========================================");

        //2.验证str是否以h开头,以d结尾,中间不是a,e,i,o,u中的某个字符
        System.out.println(str.matches("h[^aeiou]d"));// false
        System.out.println("hed".matches("h[^aeiou]d"));// false
        System.out.println("hbd".matches("h[^aeiou]d"));// true
        System.out.println("==========================================");

        //3.验证str是否a-z的任何一个小写字符开头,后跟ad
        System.out.println(str.matches("[a-z]ad"));// true
        System.out.println("Aad".matches("[a-z]ad"));// false
        System.out.println("==========================================");

        //4.验证str是否以a-d或者m-p之间某个字符开头,后跟ad
        System.out.println(str.matches("[a-dm-p]ad"));//false
        System.out.println("bad".matches("[a-dm-p]ad"));// true
        System.out.println("nad".matches("[a-dm-p]ad"));// true

    }
}

正则表达式-逻辑运算符

  • 语法示例:

    1. &&:并且
    2. | :或者
  • 代码示例:

public class Test2 {
    public static void main(String[] args) {
       
        String str = "had";
        //1.要求字符串是小写辅音字符开头,后跟ad  除了a,e,i,o,u之外,其他的都是辅音字母
        System.out.println(str.matches("[a-z&&[^aeiou]]ad"));// true
        System.out.println("aad".matches("[a-z&&[^aeiou]]ad"));// false
        System.out.println("Aad".matches("[a-z&&[^aeiou]]ad"));// false
        System.out.println("========================");

        //2.要求字符串是aeiou中的某个字符开头,后跟ad
        System.out.println(str.matches("[aeiou]ad"));// false
        System.out.println(str.matches("[a|e|i|o|u]ad"));// false

        System.out.println("aad".matches("[aeiou]ad"));// true
        System.out.println("aad".matches("[a|e|i|o|u]ad"));// true
    }
}

正则表达式-预定义字符

  • 语法示例:
    1. “.” : 匹配任何字符。如果要表示一个字符点,那么就得使用\.
    2. “\d”:任何数字[0-9]的简写;
    3. “\D”:任何非数字[^0-9]的简写;
    4. “\s”: 空白字符:[ \t\n\x0B\f\r] 的简写
    5. “\S”: 非空白字符:[^\s] 的简写
    6. “\w”:单词字符:[a-zA-Z_0-9]的简写
    7. “\W”:非单词字符:[^\w]
  • 代码示例:
public class Test3 {
    public static void main(String[] args) {
        
        String str = "258";
        //1.验证str是否3位数字
        System.out.println(str.matches("\\d\\d\\d"));// true
        System.out.println("25".matches("\\d\\d\\d"));// false
        System.out.println("+===================================");

        //2.验证手机号:1开头,第二位:3/5/8,剩下9位都是0-9的数字
        System.out.println(str.matches("1[358]\\d\\d\\d\\d\\d\\d\\d\\d\\d"));// false
        System.out.println("13838381234".matches("1[358]\\d\\d\\d\\d\\d\\d\\d\\d\\d"));// true
        System.out.println("14838381234".matches("1[358]\\d\\d\\d\\d\\d\\d\\d\\d\\d"));// false
        System.out.println("+===================================");

        //3.验证字符串是否以h开头,以d结尾,中间是任何字符
        System.out.println(str.matches("h.d"));// false
        System.out.println("h%d".matches("h.d"));// true
        System.out.println("h#d".matches("h.d"));// true
        System.out.println("+===================================");

        //4.验证str是否是:h.d
        System.out.println("h.d".matches("h.d"));// true
        System.out.println("had".matches("h.d"));// true

        System.out.println("h.d".matches("h\\.d"));// true
        System.out.println("had".matches("h\\.d"));// false

    }
}

正则表达式-数量词

  • 语法示例:
    1. X? : 0次或1次
    2. X* : 0次到多次
    3. X+ : 1次或多次
    4. X{n} : 恰好n次
    5. X{n,} : 至少n次
    6. X{n,m}: n到m次(n和m都是包含的)
  • 代码示例:
public class Test4 {
    public static void main(String[] args) {
        
        //1.验证str是否是三位数字
        System.out.println("123".matches("\\d{3}"));// true
        System.out.println("12".matches("\\d{3}"));// false
        System.out.println("1234".matches("\\d{3}"));// false
        System.out.println("===================================");

        //2.验证str是否是多位数字
        System.out.println("12".matches("\\d{2,3}"));// true
        System.out.println("123".matches("\\d{2,3}"));// true
        System.out.println("1223".matches("\\d{2,3}"));// false

        System.out.println("1".matches("\\d+"));// true
        System.out.println("12".matches("\\d+"));// true
        System.out.println("123".matches("\\d+"));// true
        System.out.println("1234".matches("\\d+"));// true
        System.out.println("===================================");

        //3.验证str是否是手机号:1).第一位为1 2).第二位是3,5,8 3).后面9位都是数字
        System.out.println("13838381234".matches("1[358]\\d{9}"));// true
        System.out.println("14838381234".matches("1[358]\\d{9}"));// false
        System.out.println("===================================");

        //4.验证qq号码:1).5--15位;2).全部是数字;3).第一位不是0
        System.out.println("123456".matches("[1-9]\\d{4,14}"));// true
        System.out.println("023456".matches("[1-9]\\d{4,14}"));// false
        System.out.println("123".matches("[1-9]\\d{4,14}"));// false
    }
}

正则表达式-分组括号( )

public class Test5 {
    public static void main(String[] args) {
        /*
            正则表达式-分组括号( )
         */
        String str = "DG8FV-B9TKY-FRT9J-99899-XPQ4G";
        // 分成5组: 前面4组的规则是一样的 后面一组单独规则
        System.out.println(str.matches("([A-Z0-9]{5}-){4}[A-Z0-9]{5}"));
        // xxyy
        // \\1表示第一组 {1}表示第一组再出现一次   \\2表示第二组  {1}表示第二组再出现一次
        System.out.println("呵呵哈哈".matches("(.)\\1{1}(.)\\2{1}"));// true
        System.out.println("呵呵呵哈哈哈".matches("(.)\\1{1}(.)\\2{1}"));// false
        System.out.println("呵呵呵哈哈哈".matches("(.)\\1{2}(.)\\2{2}"));// true
    }
}

String中正则表达式的使用

String的split方法中使用正则表达式

  • String类的split()方法原型:
    public String[] split(String regex)//参数regex就是一个正则表达式。可以将当前字符串中匹配regex正则表达式的符号作为"分隔符"来切割字符串。
    
  • 代码示例:
public class Demo {
	public static void main(String[] args) {
		String str = "18  4 567       99     56";
		String[] strArray = str.split(" +");
		for (int i = 0; i < strArray.length; i++) {
			System.out.println(strArray[i]);
		}
	}
}

String类的replaceAll方法中使用正则表达式

  • String类的replaceAll()方法原型:
public String replaceAll(String regex,String newStr)//参数regex就是一个正则表达式。可以将当前字符串中匹配regex正则表达式的字符串替换为newStr。
  • 代码示例:
public class Demo {
    public static void main(String[] args) {
        //将下面字符串中的"数字"替换为"*"
        String str = "jfdk432jfdk2jk24354j47jk5l31324";
        System.out.println(str.replaceAll("\\d+", "*"));
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值