java12学习笔记

Switch 表达式(预览特性)

java12之前版本的Switch存在下面的问题:

下落(Fall-through) 行为:不写 break 语句的情况下,Switch 语句会从一个 case "穿透" 到下一个 case,忽略了这个会导致不可饶恕的错误。

代码冗余:每个 case,我们都需要重复类似的代码结构,增加了代码的冗余和维护难度。

public static String getDayType(String datName) {
        String result = "";
        switch (datName) {
            case "Monday":
                result = "Workday";
                break;
            case "Tuesday":
            case "Wednesday":
            case "Thursday":
            case "Friday":
                result = "Workday";
                break;
            case "Saturday":
            case "Sunday":
                result = "Weekday";
                break;
            default:
                result = "UnknownDay";
        }
        return result;
    }

可以优化为

    public static String getDayType(String datName) {
        String result = "";
        switch (datName) {
            case "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" -> result = "Workday";
            case "Saturday", "Sunday" -> result = "Weekday";
            default -> result = "UnknownDay";
        }
        ;
        return result;
    }

java13后 还可以优化为

    public static String getDayType(String datName) {
        return switch (datName) {
            case "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" -> "Workday";
            case "Saturday", "Sunday" -> "Weekday";
            default -> "UnknownDay";
        };
    }

支持压缩数字格式化

        var compactNumberInstance = NumberFormat.getCompactNumberInstance(Locale.CHINA,NumberFormat.Style.SHORT);
        System.out.println(compactNumberInstance.format(1_0000));
        System.out.println(compactNumberInstance.format(1_9200));
        System.out.println(compactNumberInstance.format(1_000_000));
        System.out.println(compactNumberInstance.format(1L << 30));
        System.out.println(compactNumberInstance.format(1L << 40));
        System.out.println(compactNumberInstance.format(1L << 50));

String新增方法

indent(int n)根据参数n对字符串进行缩进
transform()将字符串转换为 R 形式的结果。
describeConstable()该方法用于支持新的常量 API,它返回一个 Optional,描述字符串的常量描述。
resolveConstantDesc()则与 describeConstable() 相关,用于解析常量描述

transform()

        var result = "foo".transform(input -> input + " bar").transform(String::toUpperCase);
        System.out.println(result); //FOO BAR

indent()

n>0时,会在字符串的每一行开头插入n个空格,字符串整体右移。

n<0时,会在字符串的每一行开头删除n个空格,如果实际的空格数小于n,删除该行所有空格,但是并不会换行。

        String txt = "法外狂徒张三";
        String s = txt.transform(str -> str.repeat(2));
        System.out.println(s);
        String s1 = txt.transform(str -> "罗教授:" + str.indent(2));
        System.out.println(s1);

describeConstable()

=Optional.of(this)

public Optional<String> describeConstable() {
    return Optional.of(this);
}
        String txt = "法外狂徒张三";
        Optional<String> s = txt.describeConstable();
        System.out.println(s.orElse(null));

resolveConstantDesc()

        String txt = "法外狂徒张三";
        Optional<String> s1 = txt.describeConstable();
        System.out.println(s1.orElse(""));
        String s2 = txt.resolveConstantDesc(null);
        System.out.println(s2);

新增Files API

Files工具类中增加了一个新的静态方法Files.mismatch(Path,Path),用来找两个文件内容(byte)不一样的地方,返回两个文件内容中第一个不匹配字节的位置,如果完全相同

一个汉字,全角空格3个字节,数组和英文,半角空格都是1个字节

        String txt1 = "x法外狂徒 张三";
        Path path1 = Path.of("test1.txt");

        String txt2 = "x法外狂徒 罗教授";
        Path path2 = Path.of("test2.txt");

        Files.writeString(path1, txt1);
        Files.writeString(path2, txt2);

        long mismatch = Files.mismatch(path1, path2);
        System.out.println("mismatch: " + mismatch);

新增 Collectors API

对Stream流的聚合操作Collector进一步增强,增加了teeing操作来实现一些复杂的聚合操作。它接受两个收集器(Collector)和一个二元运算函数(BiFunction),可以并行地将数据发送到两个不同的收集器,并在最后将这两个收集器的结果合并。

public static <T, R1, R2, R>
    Collector<T, ?, R> teeing(Collector<? super T, ?, R1> downstream1,
                              Collector<? super T, ?, R2> downstream2,
                              BiFunction<? super R1, ? super R2, R> merger)

剩下更新内容建议去官网自行学习吧,翻阅了很多博主的文章,发现都是翻译了一下

官网地址如下

JDK 12

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值