一文梳理Java 8后的新功能

作者:Kwanwooo 时间:2023-07-13 07:41:43 

为什么要写这篇文章

经过了若干年的发展,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

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

来源:https://www.cnblogs.com/kwanwoo/p/15734785.html

标签:java8,新功能
0
投稿

猜你喜欢

  • Android App开发中使用RecyclerView替代ListView的实践

    2021-06-14 06:53:36
  • Android圆形旋转菜单开发实例

    2023-09-06 11:42:52
  • 详解Java如何实现在PDF中插入,替换或删除图像

    2022-04-07 22:40:36
  • c语言中十六进制转二进制显示的实现方法

    2023-12-17 23:21:44
  • FeignClient如何通过配置变量调用配置文件url

    2023-05-07 08:19:25
  • springboot2.X整合prometheus监控的实例讲解

    2021-07-04 13:49:59
  • Android编程实现图片平铺的方法分析

    2022-05-27 06:37:40
  • java扩展Hibernate注解支持java8新时间类型

    2021-09-12 07:43:38
  • Spring中Bean扫描原理详情

    2022-05-26 04:33:14
  • Java中ArrayList和LinkedList的遍历与性能分析

    2023-10-31 11:04:17
  • Java使用sftp定时下载文件的示例代码

    2022-11-14 06:11:47
  • Android中通知Notification的使用方法

    2023-10-17 22:06:17
  • C#利用控件拖拽技术制作拼图游戏

    2023-05-24 21:27:34
  • 算法证明每一位都相同十进制数不是完全平方数

    2022-06-21 23:00:46
  • Java 十大排序算法之希尔排序刨析

    2021-11-16 09:27:31
  • Android实现注册界面

    2023-06-20 15:04:45
  • java获取和设置系统变量问题(环境变量)

    2023-11-19 07:34:07
  • C#字符串如何提取数值(带小数点)

    2023-01-27 06:10:25
  • C# SkinEngine控件 给窗体添加皮肤的方法

    2021-10-21 23:32:08
  • java实现创建临时文件然后在程序退出时自动删除文件

    2023-02-15 18:27:00
  • asp之家 软件编程 m.aspxhome.com