java12新特性一:switch表达式

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表达式特点

  1. 可以使用->操作符,默认会在后面自动添加break
  2. 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);
    }
}

可以看出java12switch的代码更清晰,更简洁

特点二、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);
    }

}

java12新特性二:Files新增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
}

java12新特性三:String类新增的方法

  1. transform

transform的定义如下:传入的是一个Function类型的接口,意味着可以使用函数式编程对已有的字符串进行转换

public <R> R transform(Function<? super String, ? extends R> f) {
    return f.apply(this);
}
  1. indent
    indent:允许我们调整缩进的宽度,意识是可以调整所有tab键产生的空格数量

java13新特性一:新语法 文本块

语法格式:三对双引号,前面三个双引号需要有一个回车

"""
这是文本块内容"""
如果代码是
"""
这是文本块内容
"""
相当于
"这是文本块内容\n"

这样也就产生了一个问题就是代码缩进对齐,例如一般我们写代码会以缩进对齐代码例如:
java12/13新特性_新特性

\s相当于一个空格缩进会自动去掉
java12/13新特性_缩进_02

文本块的好处 ( 点赞 ๑•̀ㅂ•́)و✧ )

数据库持久层框架,例如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
        """;
使用文本块的注意点

文本块中使用"""需要加一个转义符\进行转义

java13新特性二:新特性 Class-Data-Share

多个虚拟机加载同一个类则只需要加载一个类即可,虚拟机加载一个类会产生一个类共享文件,其它虚拟机如果需要加载同一个类则只需要从这个共享文件中获取即可

java13新特性三:ZGC取消使用 未使用的内存

JVM会自动的将没有使用的内存交还操作系统

使用的场景:

  1. 容器环境
  2. 长时间闲置的java应用程序,并且又很多其它应用共享和竞争资源的环境
  3. 应用程序再运行的过程中对于堆的内存需求不同

java13新特性四:重新实现SocketAPI

使用SocketImpl代替原先的Socket,原先的版本保留,如果像使用java13中提供的则使用这个类