zoukankan      html  css  js  c++  java
  • Java 8 后的新功能梳理

    为什么要写这篇文章

    经过了若干年的发展,Java逐步从java8升级为java11java17
    让我们对比学习一下最新一版的LTS版本和java8比起来让代码简化了多少。

    1. 文本块(Text Blocks)。

    这个写法有些类似于 javascript、 Lua等脚本语言。方便识别html、json等格式复杂的字符串。

    public class StringTest {
        public static void main(String[] args) throws Exception {
             // 传统写法
            String json =
                    "{\n" +
                    "    \"key\":\"a\",\n" +
                    "    \"value\":\"b\"\n" +
                    "}";
            // 优化后写法
            String json2 = """
                    {
                        "key":"a",
                        "value":"b"
                    }
                    """;
            // 返回为 true
            System.out.println(json == json2);
        }
    }
    
    1. 本地变量类型推断(Local Variable Type Inference)

    这一点也是在一些脚本语言中常见的,类似于 var 表示变量,val 表示常量。

        public static void main(String[] args) throws Exception {
            //集合
            // immutable map build
            var map = Map.of(
                    "cat", "猫",
                    "dog", "狗",
                    "fish", "鱼");
            // immutable set build
            var set = Set.of("1", "2", "3");
            // immutable list build
            var list = List.of(1, 2, 3, 4, 5);
    
            // 循环语句
            for (var i = 1; i < list.size(); i++) {
                System.out.println(i);
            }
            for (var i : list) {
                System.out.println(i);
            }
    
            // 异常
            try (var in = new ByteArrayInputStream("123".getBytes())) {
                System.out.println(new String(in.readAllBytes(), "utf-8"));
            } catch (Exception e) {
                System.out.println(e);
            }
    
            // lambda 表达式 意思相同
            BiFunction<Integer, Integer, Integer> biFunction = (a, b) -> a + b;
            BiFunction<Integer, Integer, Integer> biFunction2 = (var a, var b) -> a + b;
        }
    
    1. switch
        public static void main(String[] args) throws Exception {
            var eating = Eating.BREAKFAST;
            String eatingZnString = "";
            // 传统写法
            switch (eating) {
                case BREAKFAST:
                case LUNCH:
                    eatingZnString = "早午饭";
                    break;
                case DINNER:
                    eatingZnString = "晚饭";
                    break;
                default:
                    throw new Exception();
            }
            System.out.println(eatingZnString);
    
            // 优化后写法
            System.out.println(
                    switch (eating) {
                        case BREAKFAST,LUNCH -> "早午饭";
                        case DINNER -> "晚饭";
                        default -> throw new Exception();
                    }
            );
        }
    
    1. instance of操作符的模式匹配(Pattern Matching for the instanceof Operator)
    
    interface Animal {}
    
    class Cat implements Animal {
        public void mew() {
            System.out.println("喵");
        }
    }
    
    class Dog implements Animal {
        public void woof() {
            System.out.println("汪");
        }
    }
    
    public class Test {
        // 传统写法
        public static void sounds(Animal animal) {
            if (animal instanceof Cat) {
                Cat cat = (Cat) animal;
                cat.mew();
            } else if (animal instanceof Dog) {
                Dog dog = (Dog) animal;
                dog.woof();
            } else {
                throw new IllegalArgumentException("没有这种动物的叫声");
            }
        }
        
        // 优化写法
        public static void betterSounds(Animal animal) {
            if (animal instanceof Cat cat) {
                cat.mew();
            } else if (animal instanceof Dog dog) {
                dog.woof();
            } else {
                throw new IllegalArgumentException("没有这种动物的叫声");
            }
        }
    }
    
    1. record 类
    // 传统类
    public final class People {
        public People(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public String name() {
            return this.name;
        }
    
        public int age() {
            return this.age;
        }
        public boolean equals(People people) {...}
        public int hashCode() {...}
        public String toString() {...}
    }
    
    // 优化后的类
    public record People (String name, int age){ 
        
    }
    
    // 更多用法
    public record People (String name, int age){
        // 静态字段
        static int teenageAge;
    
        // 静态初始化
        static {
            teenageAge = 17;
        }
        // 静态方法
        public static People buildTeenage(String name) {
            return new People(name , teenageAge);
        }
    
        // 优化后的构造方法
        public People {
            if (age < 0) {
                throw new IllegalArgumentException("年龄不能小于0");
            }
        }
    }
    

    参考文档

    Java Language Updates

  • 相关阅读:
    HighCharts基本使用
    Django REST framework
    Python基础知识之大杂烩
    聚类算法:K-Means
    决策树学习笔记
    pd.read_csv() 、to_csv() 之 常用参数
    对分类型变量,进行编码处理——pd.get_dummies()、LabelEncoder()、oneHotEncoder()
    分类模型效果评估
    标准差、方差、协方差的区别
    copy 和 deepcopy的区别
  • 原文地址:https://www.cnblogs.com/kwanwoo/p/15734785.html
Copyright © 2011-2022 走看看