jdk12以前的switch是这样的
/**
* 枚举
*/
enum Fruit {
PEAR, APPLE, GRAPE, MANGO, ORANGE, PAPAYA;
}
public class SwitchTest {
public static void main(String[] args) {
int numberOfLetters;
Fruit fruit = Fruit.APPLE;
switch (fruit) {
case PEAR:
numberOfLetters = 4;
break;
case APPLE:
case GRAPE:
case MANGO:
numberOfLetters = 5;
break;
case ORANGE:
case PAPAYA:
numberOfLetters = 6;
break;
default:
throw new IllegalStateException("No Such Fruit:" + fruit);
}
System.out.println(numberOfLetters);
}
}
新版本的switch
表达式特点->
操作符,默认会在后面自动添加break
switch表达式拥有返回值
->
在jdk12中switch可以这样写
enum Fruit {
PEAR, APPLE, GRAPE, MANGO, ORANGE, PAPAYA;
}
@Test
public void testSwitch1(){
Fruit fruit = Fruit.APPLE;
switch(fruit) {
case PEAR -> System.out.println("4");
case APPLE,GRAPE,MANGO -> System.out.println("5");
case ORANGE,PAPAYA -> System.out.println("6");
default -> throw new IllegalStateException("No Such Fruit:" + fruit);
}
}
可以看出java12
中switch
的代码更清晰,更简洁
switch
拥有返回值enum Fruit {
PEAR, APPLE, GRAPE, MANGO, ORANGE, PAPAYA;
}
@Test
public void testSwitch2(){
int numberOfLetters;
Fruit fruit = Fruit.APPLE;
numberOfLetters = switch(fruit) {
case PEAR -> 4;
case APPLE,GRAPE,MANGO -> 5;
case ORANGE,PAPAYA -> 6;
default -> throw new IllegalStateException("No Such Fruit:" + fruit);
};
System.out.println(numberOfLetters);
}
java13
中对switch
进一步改进,利用关键字yield
可以对多态语句中将值返回,相当于函数的return
总的意思就是使用箭头表达式如果右边的语句是多条语句,则用{ }
括起来,然后对于返回值则通过关键字yield
进行返回
public class JDK13Demo {
enum Fruit {
PEAR, APPLE, GRAPE, MANGO, ORANGE, PAPAYA;
}
@Test
public void switchTest(){
int numberOfLetters;
Fruit fruit = Fruit.APPLE;
numberOfLetters = switch(fruit) {
case PEAR -> 4;
case APPLE,GRAPE,MANGO -> {
yield 5;
}
case ORANGE,PAPAYA -> 6;
default -> {
yield 7;//返回
}
};
System.out.println(numberOfLetters);
}
}
mismatch
方法作用是匹配文件内容是否相同,相同则返回-1
,存在不相同则返回首次匹配到不同内容的索引
@Test
public void filesTest() throws IOException {
FileWriter fileWriter = new FileWriter("./src/a.txt");
fileWriter.write("a");
fileWriter.write("b");
fileWriter.write("c");
fileWriter.close();
FileWriter fileWriter2 = new FileWriter("./src/b.txt");
fileWriter2.write("a");
fileWriter2.write("a");
fileWriter2.write("c");
fileWriter2.close();
long index = Files.mismatch(Path.of("./src/a.txt"), Path.of("./src/b.txt"));
System.out.println(index);//打印索引1,因为第二个字符不同如果将其改成相同的则返回-1
}
transform的定义如下:传入的是一个Function类型的接口,意味着可以使用函数式编程对已有的字符串进行转换
public <R> R transform(Function<? super String, ? extends R> f) {
return f.apply(this);
}
语法格式:三对双引号,前面三个双引号需要有一个回车
"""
这是文本块内容"""
"""
这是文本块内容
"""
"这是文本块内容\n"
这样也就产生了一个问题就是代码缩进对齐,例如一般我们写代码会以缩进对齐代码例如:
文本块的好处 ( 点赞 ๑•̀ㅂ•́)و✧ )
数据库持久层框架,例如mybatis在@Select、@Insert、@Delete、@Update
这类注解中需要写SQL
那么这种风格的好处就很显而易见了,代码简洁不需要像以前那种需要通过字符串拼接。文本块中也支持\n
也可以不写直接回车
例如:
String sql = "select employee_id,last_name,salary,department_id\n" +
"from employees\n" +
"where department_id in (40,50,60)\n" +
"order by department_id asc";
String sql1 = """
select employee_id,last_name,salary,department_id
from employees
where department_id in (40,50,60)
order by department_id asc
""";
文本块中使用"""需要加一个转义符\
进行转义
多个虚拟机加载同一个类则只需要加载一个类即可,虚拟机加载一个类会产生一个类共享文件,其它虚拟机如果需要加载同一个类则只需要从这个共享文件中获取即可
JVM会自动的将没有使用的内存交还操作系统
使用的场景:
Socket
API使用SocketImpl
代替原先的Socket,原先的版本保留,如果像使用java13中提供的则使用这个类