一文梳理Java 8后的新功能

 更新时间:2022年02月08日 14:57:42   作者:Kwanwooo  
Java 8是Java自Java 5(发布于2004年)之后的最重要的版本,下面这篇文章主要给大家介绍了关于Java8后新功能的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

为什么要写这篇文章

经过了若干年的发展,Java逐步从java8升级为java11,java17。

让我们对比学习一下最新一版的LTS版本和java8比起来让代码简化了多少。

文本块(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);
    }
}

本地变量类型推断(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;
    }

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();
                }
        );
    }

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("没有这种动物的叫声");
        }
    }
}

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

总结

到此这篇关于Java 8后新功能的文章就介绍到这了,更多相关Java8后的新功能内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入了解Java设计模式之UML类图

    深入了解Java设计模式之UML类图

    UML 即 Unified Modeling Language 统一建模语言,是用来设计软件的可视化建模语言。本文就带大家了解一下UML中类图的定义与使用,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-11-11
  • Java字符串 正则表达式详解

    Java字符串 正则表达式详解

    这篇文章主要介绍了java使用正则表达式查找包含的字符串功能,结合具体实例形式分析了java针对字符串匹配查找的相关实现技巧,需要的朋友可以参考下
    2021-09-09
  • springboot中如何配置LocalDateTime JSON返回时间戳

    springboot中如何配置LocalDateTime JSON返回时间戳

    这篇文章主要介绍了springboot中如何配置LocalDateTime JSON返回时间戳问题。具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Java 提取照片的EXIF信息批量重命名

    Java 提取照片的EXIF信息批量重命名

    这篇文章主要介绍了Java 提取照片的EXIF信息批量重命名的方法,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-04-04
  • Java程序单实例运行的简单实现

    Java程序单实例运行的简单实现

    这篇文章主要介绍了Java程序单实例运行的简单实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Spring 零基础入门WebFlux框架体系

    Spring 零基础入门WebFlux框架体系

    Spring5发布有两年了,随Spring5一起发布了一个和Spring WebMvc同级的Spring WebFlux。这是一个支持反应式编程模型的新框架体系。反应式模型区别于传统的MVC最大的不同是异步的、事件驱动的、非阻塞的,这使得应用程序的并发性能会大大提高,单位时间能够处理更多的请求
    2022-07-07
  • java 压缩图片(只缩小体积,不更改图片尺寸)的示例

    java 压缩图片(只缩小体积,不更改图片尺寸)的示例

    这篇文章主要介绍了java 如何压缩图片体积,帮助大家更好的利用Java处理图片,应对特殊情况,感兴趣的朋友可以了解下
    2020-10-10
  • 深入了解Spring中Bean的作用域和生命周期

    深入了解Spring中Bean的作用域和生命周期

    这篇文章主要介绍了深入了解Spring中Bean的作用域和生命周期,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 一文掌握SpringBoot多环境配置

    一文掌握SpringBoot多环境配置

    在实际项目的开发过程中,我们程序往往需要在不同环境中运行,每个环境中的配置参数可能都会有所不同,例如数据库连接信息、文件服务器等等,下面小编给大家介绍SpringBoot多环境配置,感兴趣的朋友一起看看吧
    2024-04-04
  • Spring Validator接口校验与全局异常处理器

    Spring Validator接口校验与全局异常处理器

    这篇文章主要介绍了Spring Validator接口校验与全局异常处理器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11

最新评论