一文梳理Java 8后的新功能

目录
  • 文本块(Text Blocks)
  • 本地变量类型推断(Local Variable Type Inference)
  • switch
  • instance of操作符的模式匹配(Pattern Matching for the instanceof Operator)
  • record 类
  • 参考文档
  • 总结

为什么要写这篇文章

经过了若干年的发展,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后的新功能内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java15新功能的详细讲解

    目录 1. JEP 339 爱德华曲线算法(EdDSA) 2. JEP 360:Sealed Classes(密封类)预览 3. JEP 371:Hidden Classes(隐藏类) 4. JEP 372:移除 Nashorn JavaScript 引擎 5. JEP 373:重新实现 DatagramSocket API 6. JEP 374:禁用和废弃偏向锁(Biased Locking) 7. JEP 375:instanceof 类型匹配 (二次预览) 8. JEP 377:ZGC:

  • java8到java15的新功能简介

    本博文将为您提供自Java 7以来增加的很棒的新功能的示例.我将展示每个Java版本的至少一项重大改进,一直到2020年秋季发布的Java 15都有.Java现在完全支持lambda和函数式编程,类型推断通过var,具有简单构造函数的不可变集合以及多行字符串.此外,还有令人兴奋的实验新功能,例如数据类(record)和sealed类.最后,我将讨论Java REPL,它为快速实验提供了很高的价值. 函数式编程(Java 8) 在Java 8中,功能编程和lambda被添加为语言功能.函数式编程的

  • 一文梳理Java 8后的新功能

    目录 文本块(Text Blocks) 本地变量类型推断(Local Variable Type Inference) switch instance of操作符的模式匹配(Pattern Matching for the instanceof Operator) record 类 参考文档 总结 为什么要写这篇文章 经过了若干年的发展,Java逐步从java8升级为java11,java17. 让我们对比学习一下最新一版的LTS版本和java8比起来让代码简化了多少. 文本块(Text Blo

  • Java基础之spring5新功能学习

    一.前言 1.整个 Spring5 框架的代码基于 Java8 ,运行时兼容 JDK9,许多不建议使用的类和方 法在代码库中删除 2.Spring 5框架自带了通用的日志封装 Spring5 已经移除 Log4jConfigListener,官方建议使用 Log4j2 二.日志配置 jar包 <!-- 日志 --> <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core --> <

  • 一文学习Java NIO的ByteBuffer工作原理

    网络数据的基本单位永远是 byte(字节).Java NIO 提供 ByteBuffer 作为字节的容器,但该类过于复杂,有点难用. ByteBuf是Netty当中的最重要的工具类,它与JDK的ByteBuffer原理基本上相同,也分为堆内与堆外俩种类型,但是ByteBuf做了极大的优化,具有更简单的API,更多的工具方法和优秀的内存池设计. 1 API Netty 的数据处理 API 通过两个组件暴露--抽象类ByteBuf 和 接口 ByteBufHolder. ByteBuf API 的优

  • 一文精通Java 多线程之全方位解读

    目录 并行和并发 线程基础概念 线程和进程 多线程的好处 线程的状态 实现多线程的两种方式 继承Thread类 实现Runnable接口 线程的安全性和原子性 锁的概念和使用 生产消费者模型 生产消费者模型中的类–存储类 生产消费者模型中的类–生产者 生产消费者模型中的类–消费者 测试类 效果 volatile变量 线程池的概念和使用 并行和并发 并行:多个CPU实例或是多台机器同时执行一段处理逻辑,是真正的同时. 并发:一个CPU或一台机器,通过CPU调度算法,让用户看上去同时去执行,实际上从

  • 一文了解Java 线程池的正确使用姿势

    目录 概述 线程池介绍 线程池创建 ThreadPoolExecutor创建 Executors创建 newFixedThreadPool newCachedThreadPool newSingleThreadExecutor newScheduledThreadPool newWorkStealingPool 线程池关键API和例子 提交执行任务API 关闭线程池API 线程池监控API 扩展API 使用注意事项 概述 线程池在平时的工作中出场率非常高,基本大家多多少少都要了解过,可能不是很全

  • 一文秒懂java到底是值传递还是引用传递

    首先回顾一下在程序设计语言中有关将参数传递给方法(或函数)的一些专业术语.按值调用(call by value)表示方法接收的是调用者提供的值,而按引用调用(call by reference)表示方法接收的是调用者提供的变量地址.一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值. 它用来描述各种程序设计语言(不只是 Java)中方法参数传递方式. Java 程序设计语言总是采用按值调用.也就是说,方法得到的是所有参数值的一个拷贝,也就是说,方法不能修改传递给它的任何参

  • 一文解开java中字符串编码的小秘密(干货)

    简介 在本文中你将了解到Unicode和UTF-8,UTF-16,UTF-32的关系,同时你还会了解变种UTF-8,并且探讨一下UTF-8和变种UTF-8在java中的应用. 一起来看看吧. Unicode的发展史 在很久很久以前,西方世界出现了一种叫做计算机的高科技产品. 初代计算机只能做些简单的算数运算,还要使用人工打孔的程序才能运行,不过随着时间的推移,计算机的体积越来越小,计算能力越来越强,打孔已经不存在了,变成了人工编写的计算机语言. 一切都在变化,唯有一件事情没有变化.这件事件就是计

  • 一文秒懂Java enum常见的用法讲解

    简介 枚举是Java1.5引入的新特性,通过关键字enum来定义枚举类.枚举类是一种特殊类,它和普通类一样可以使用构造器.定义成员变量和方法,也能实现一个或多个接口,但枚举类不能继承其他类. 一,常量定义 public enum WeekDay { SUN, MON, TUE, WED, THT, FRI, SAT } 二,swich public enum WeekDay { SUN, MON, TUE, WED, THT, FRI, SAT } public class SelectDay{

  • Java 17的一些新特性介绍

    目录 前言 Java 17中的Sealed 密封类 Java 17提供了更好的随机生成器 Java对增强安全性的关注 Pattern Matching For Switch预览 前言 Java17将是一个长期支持的LTS版本. Java采用了6个月的发布周期.也就是说,它将每6个月发布一个新版本的Java.每隔3年,LTS版本就会发布一次.目前,Java 11是LTS版本,于2018年9月发布.但在Java17发布后,它将是最新的LTS支持. 许多组织依赖LTS版本,所以他们使用的是Java11

  • 一文学会Java运算符的使用

    目录 算术运算符 关系运算符 逻辑运算符 赋值运算符 条件运算符 运算符优先级 算术运算符 运算符 描述 + 两数相加 - 两数相减 * 两数相乘 / 两数相除 % 取模,返回两数相除的余数 ++ 自加一 - - 自减一 public class User { public static void main(String[] args) { int a = 20; int b = 10; System.out.println(a + b); System.out.println(a - b);

随机推荐