Java 常用新特性概述

参考资料

  1. Java 11 升Java 17 重要特性必读

目录

  • 一. JDK14_Switch表达式
  • 二. JDK15_文本块
  • 三. JDK16_instanceof匹配模式


一. JDK14_Switch表达式

⏹ 定义一个枚举类

import java.util.Arrays;

public enum CategoryType {
	
	老师("1"),
	学生("2"),
	家属("3"),
	外派("4"),
	领导("5"),
	其他("6");
	
	private String code;
	
	CategoryType(String code) {
		this.code = code;
	}
	
	 public String getCode() {
		return code;
	 }
	 
	 public static CategoryType fromCode(String code) {
		return Arrays.stream(CategoryType.values())
					.filter(item -> item.code.equals(code))
					.findAny()
					.orElse(null);
	}
}

⏹ 使用新的Switch表达式

// 成员code
String typeCode = "1";
// 根据成员code获取对应的枚举类对象
CategoryType categoryType = CategoryType.fromCode(typeCode);

String result = switch (categoryType) {
	// 当枚举类的对象为 老师、学生、领导的时候,走这个分支
	case 老师, 学生, 领导 -> "学校内部成员, 该成员的身份为: " + categoryType.name();
	case 家属, 外派 -> "学校外部成员, 该成员的身份为: " + categoryType.name();
	case 其他 -> "其他成员, 该成员的身份为: " + categoryType.name();
	default -> "该成员不存在";
};
System.out.println(result);
// 学校内部成员, 该成员的身份为: 老师

二. JDK15_文本块

文本块,是一个多行字符串,它可以避免使用大多数转义符号,自动以可预测的方式格式化字符串,并让开发人员在需要时可以控制格式。

import java.text.MessageFormat;

// 可以看到,无需添加额外的换行符,看起来也更加直观
String content = """
下記情報より入館準備作業をお願い致します。
  (1)契約者申請日: {0}
  (2)契約社員名: {1}
  (3)会社名(BP社員側):{2}

※IDカード作成するためBP社員の顔写真は下記アドレスに置いています。
  格納先:\\\\192.168.255.245\\XXX社内情報\\104_IDカード(全社)\\☆☆新規依頼ID写真格納フォルダ☆☆
""";

// 邮件中需要用到的参数
String[] params = {
	// {0} => 契約者申請日
	"2023/05/16",
	// {1} => 契約社員名
	"贾飞天",
	// {2} => 会社名(BP社員側)
	"ZY株式会社"
};
String mailContent = MessageFormat.format(content, params);
System.out.println(mailContent);
/*
	下記情報より入館準備作業をお願い致します。
	  (1)契約者申請日: 2023/05/16
	  (2)契約社員名: 贾飞天
	  (3)会社名(BP社員側):ZY株式会社
	
	※IDカード作成するためBP社員の顔写真は下記アドレスに置いています。
	  格納先:\\192.168.255.245\XXX社内情報\104_IDカード(全社)\☆☆新規依頼ID写真格納フォルダ☆☆
*/

三. JDK16_instanceof匹配模式

import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class Student {
	
	private String name;
	
	private String age;
	
	private String address;
}
// 用过构建者方法创建一个对象,为了测试,将类型指定为Object类型
Object student = Student.builder().age("10").address("地球").name("贾飞天").build();

// JDK16之前的写法: 判断之后,需要手动进行转换
if (student instanceof Student) {
	Student stu = (Student)student;
	String name = stu.getName();
	System.out.println("名字是: " + name);  // 名字是: 贾飞天
}

// JDK16之后的写法: 如果通过类型检查之后,可以自动进行类型转换
if (student instanceof Student stu) {
	String name = stu.getName();
	System.out.println("名字是: " + name);  // 名字是: 贾飞天
}

/**
 * if条件中有 && 运算符时,当 instanceof 类型匹配成功,模式局部变量的作用范围也可以相应延长
 * 注意: 仅限于 && 运算符, || 运算符时使用会有问题
 */
if (student instanceof Student stu && !ObjectUtils.isEmpty(stu.getName())) {
	String name = stu.getName();
	System.out.println("名字是: " + name);  // 名字是: 贾飞天
}

你可能感兴趣的:(Java,java)