Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >自 java8 以来开发者友好的新特性

自 java8 以来开发者友好的新特性

作者头像
用户3147702
发布于 2022-12-21 09:57:10
发布于 2022-12-21 09:57:10
34200
代码可运行
举报
运行总次数:0
代码可运行

1. 引言

此前,在 java8 问世时,我写过一篇文章,详细介绍了 java8 的新特性。

如今,java8 已经问世 8 年多了,java 已经更新到了 java19 版本,尽管目前国内 java8 仍然占据着最大的使用比例。但这不妨碍我们来看看,8 年来,java 在使用上的体验出现了哪些优化。

本文,我们就来一一看看自 java8 以来,有哪些开发者友好的新特性诞生吧。

2. switch 语句的变化

2.1 switch 表达式

switch 语句有时显得比较复杂:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public String oldMultiSwitch(int day) {
    switch (day) {
       case 1:
       case 2:
       case 3:
       case 4:
       case 5:
          return "workday";
       case 6:
       case 7:
          return "weekend";
       default:
          return "invalid";
    }
 }

java12 对此进行了优化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public String newMultiSwitch(int day) {
    return switch (day) {
       case 1, 2, 3, 4, 5 -> "workday";
       case 6, 7 -> "weekend";
       default -> "invalid";
    };
 }

通过箭头让 switch 语句变成了一个表达式,十分简洁明了。

2.2 switch 的类型匹配

自 java17 开始,可以将类型的判断应用到 switch 表达式中了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public String newSwitchWithPatternMatching(Pet pet) {
    return switch (pet) {
       case Cat c -> "cat";
       case Dog d -> "dog";
       default -> "other pet";
    };
 }

pet 变量被声明为抽象类 Pet 的对象,这个方法则实现了根据 pet 具体实现类的不同返回不同的字符串。

3. 密封类 Sealed Classes

密封类是 Kotlin 中的一个特性,在 java17 中也开始了对这一特性的支持。

Java17 引入一对新的关键词:sealed 与 non-sealed 以及与之配套使用的 permits 关键字。

3.1 密封父类

有时,在我们设计一个类时,我们只希望这个类派生出一部分我们自己定义的类,而不想让其他人去派生这个类,此时,我们就可以使用 sealed class 这个新特性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public abstract sealed class Pet permits Cat, Dog {}

这意味着,对于 Pet 这个类,我们只允许派生出 Cat 和 Dog 两个类,我们不允许其他类直接派生自 Pet 类。

所以,在我们定义 sealed 类的子类时,我们必须要加上 final 关键字,防止从这些子类派生:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public final class Cat extends Pet {}

3.2 在子类上解除密封

如果我们只是不想让任何类直接派生自 Pet 类,但却允许让 Cat 和 Dog 拥有各自的子类,那么,我们就可以使用 non-sealed 关键字来解开限制:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public non-sealed class Dog extends Pet {}

4. 文本块

在 python 等语言中,拥有文本块的特性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 def getNewPrettyPrintJson():
     return """
 {
     "firstName": "Piotr",
     "lastName": "Mińkowski"
 }
 """

但是这段代码在 java 中写起来就较为复杂:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public String getOldPrettyPrintJson() {
    return "{\n" +
           "     \"firstName\": \"Piotr\",\n" +
           "     \"lastName\": \"Mińkowski\"\n" +
           "}";
 }

从 java13 开始,java 也支持了文本块的特性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public String getNewPrettyPrintJson() {
    return """
           {
              "firstName": "Piotr",
              "lastName": "Mińkowski"
           }
           """;
 }

5. Optional 类增加了新方法

Optional 类作为 java8 的新特性,对于预防代码中令人头疼的可能的空指针异常有着非常好的作用。

在 java9 和 java10 中,相继为 Optional 类增加了新的实用的方法:

  1. orElseThrow:不存在则抛出 NoSuchElementException;
  2. ifPresentOrElse:指定不存在的行为。

有了这两个方法,原本复杂的 if 判断就可以简化成一个简单的语句了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public Person getPersonByIdOldWay(Long id) {
    Optional<Person> personOpt = repository.findById(id);
    if (personOpt.isPresent())
       return personOpt.get();
    else
       throw new NoSuchElementException();
 }
 
 public void printPersonById(Long id) {
    Optional<Person> personOpt = repository.findById(id);
    personOpt.ifPresentOrElse(
       System.out::println,
       () -> System.out.println("Person not found")
    );
 }

6. 集合工厂方法

Java9 开始,List 和 Map 都支持了 of 方法,用来简单的生成不可变的集合对象,尽管这个特性在 guava 的 ImmutableMap、ImmutableList 中早已支持:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 List<String> fruits = List.of("apple", "banana", "orange");
 Map<Integer, String> numbers = Map.of(1, "one", 2,"two", 3, "three");

当然,这样生成的集合是不可变集合,这意味着,我们不能扩充集合的容量,如果想方便的生成可变的 List,还是推荐:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public List<String> fruitsFromArray() {
    String[] fruitsArray = {"apple", "banana", "orange"};
    return Arrays.asList(fruitsArray);
 }

7. 记录类 record class

对于一个 java 的数据类,我们经常会为它设置 getter 和 setter 方法,以及 toString、equals、hasCode 等方法,这看起来非常繁琐,所以我们往往会使用 Lombok 的 @Data 注解来简化这一过程。

但大部分时候,对于一个数据类,我们通常只需要生成 getter 方法,因为一旦对象创建,我们只需要频繁获取其字段的值,而不需要重新设置。

java14 中,引入了 record 关键字,简化了上述类定义的过程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public record Person(String name, int age) {}

这个 record 类型的类声明会等效于为 Person 类添加了 name 和 age 两个字段的 getter 方法,同时也会自动创建 toString、equals、hasCode 等方法,使用起来就非常简单了。

8. 接口的私有方法

在 java8 中,引入了 default 关键字,允许为接口定义方法的默认实现。到了 java9 中,允许为接口定义 private 的方法,这个特性可以说得到了完全的实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public interface ExampleInterface {
    private void printMsg(String methodName) {
       System.out.println("Calling interface");
       System.out.println("Interface method: " + methodName);
    }
 
    default void method1() {
       printMsg("method1");
    }
 
    default void method2() {
       printMsg("method2");
    }
 }

9. 运行时类型的局部变量

自 java10,你可以使用 var 关键字来定义运行时类型的变量,从 java11 开始,var 关键字可以用在 lambda 表达式中了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public String sumOfString() {
    BiFunction<String, String, String> func = (var x, var y) -> x + y;
    return func.apply("abc", "efg");
 }

结语

本文介绍了自 java8 以来,对开发者友好的 java 新特性,实际上,除了这些编写代码过程上的便捷与简化,java 在运行上和垃圾回收上的性能提升也十分值得关注,这部分我们就留待后续文章来进行介绍吧。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-11-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小脑斧科技博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java8 之后对新开发者非常友好的特性盘点
在这篇文章中,我将描述自 Java8 依赖对开发者来说最重要也最友好的特性,之所以选择 Java8 ,那是因为它依然是目前使用最多的版本。
crossoverJie
2022/10/27
3150
Java8 之后对新开发者非常友好的特性盘点
Java17新特性详解与安装
Java 17 是 2021 年 9 月 14 日正式发布的,距今也已经快2年多了,是一个长期支持(LTS)版本。Java 17 这个版本非常重要,Spring Framework 6.0 和 Spring Boot 3.0 最低支持都是 Java 17,搞Java开发肯定是离不开Spring这个主流的框架。下面这张图是 Oracle 官方给出的 Oracle JDK 支持的时间线,可以看得到Java17支持到2029年9月。
Jensen_97
2023/09/09
1.9K0
Java17新特性详解与安装
从Java8到Java17,这些新特性让你的代码起飞!
一直想找时间做一篇关于Java新特性的盘点清单,一切以实用为主,不多赘述,不讲空谈,不整虚头巴脑的概念,从实战的角度出发,根据实际开发需求,盘点值得使用的新特性。
用户1220090
2025/04/14
1700
从Java8到Java17,这些新特性让你的代码起飞!
再见Java8!万字总结Java 9~15新特性!真香
你可以在 Archived OpenJDK General-Availability Releases 上下载自己需要的 JDK 版本!
Guide哥
2021/09/16
8550
女同事问我JDK8以后有哪些新特性?给我整不会了
一提到JDK8的新特性,你可能就会联想到Lambda、函数式接口、Stream、Optional以及日期时间API增强等等;
陈哈哈
2021/12/31
4310
女同事问我JDK8以后有哪些新特性?给我整不会了
Java9-17新特性总结
Java 9 模块的重要特征是在其工件的根目录中包含了一个描述模块的 module-info.java 文 件通过exports向外开放接口/类, 限定模块使用范围同时通过requires定义该模块所需依赖
code-x
2022/06/21
6810
JDK8-JDK17中的新特性(var类型推断、模式匹配、Record、密封类)
新的语法结构,勾勒出了 Java 语法进化的一个趋势,将开发者从复杂、繁琐的低层次抽象中逐渐解放出来,以更高层次、更优雅的抽象,既降低代码量,又避免意外编程错误的出现,进而提高代码质量和开发效率。
鱼找水需要时间
2023/06/01
3.3K0
JDK8-JDK17中的新特性(var类型推断、模式匹配、Record、密封类)
Java17来了!YYDS!
上个周末我发了一篇名为:Spring 官宣,干掉 Spring 5.3.x! 的技术快报,这篇文章主要介绍了 Spring Framework 6 和 Spring Boot 3 的最新消息。
Guide哥
2021/10/11
1.4K0
【周一通勤电台】Java8-15的新特性,你知道几个?
自从2018年开始,Java采用了每六个月发布一次新版本的策略。这样的策略使得Java保持了新鲜感以及强劲的生命力,在这篇文章中,我将会为大家带来6个实用的Java新特性。
翊君
2022/03/01
3800
新项目决定用 JDK 17了
最近在调研 JDK 17,并且试着将之前的一个小项目升级了一下,在测试环境跑了一段时间。最终,决定了,新项目要采用 JDK 17 了。
古时的风筝
2022/12/21
1.1K0
新项目决定用 JDK 17了
Java8-19新特性一览 ,认识全新的前沿技术
如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、评论、收藏➕关注,您的支持是我坚持写作最大的动力。
猫头虎
2024/04/08
1980
Java8-19新特性一览 ,认识全新的前沿技术
3分钟带你品尝新鲜出炉的Java 17,看完就知道香不香!
Java已经过了20个年头了,Java8之后,JDK的发行计划变了不少,半年一小聚,三年一大闹。根据Oracle官方的的文档,长期支持的Java版本是Java11 和 Java17。其中Java17计划在2021年9月14号发布,Java17 将是一个长期支持的版本(Long Terms Support)。既然长期支持,作为Java程序员就必须重视并搞起来。那么让我们来阅览一下二十年陈酿 Java17 。文木附送OpenJDK 17 Earily Access 版本下载地址,还不玩起来!
纯洁的微笑
2021/09/15
1.7K0
3分钟带你品尝新鲜出炉的Java 17,看完就知道香不香!
SpringBoot3正式版将于11月24日发布:都有哪些新特性?
从 2018 年 2 月 28 号发布 Spring Boot 2.0 版本开始,整个 2.X 版本已经经过了 4 年多的时间,累计发布了 95 个不同的版本,而就在前不久,2.X 系列的也已经迎来了他的最终版本:2.7。
艾小仙
2022/12/05
1.2K0
SpringBoot3正式版将于11月24日发布:都有哪些新特性?
Java 9-15 ,语法新特性汇总
var 是 Java10 版本中新出的特性,用它来定义局部变量。var 不是关键字,相当于一种动态类型,编译器根据变量所赋的值来推断类型。所以必须在定义变量的时候赋初始值。
冷冷
2021/04/07
3470
Java 9-15  ,语法新特性汇总
青空の霞光Java新特性笔记
经过前面的学习,我们基本已经了解了Java 8及之前的所有语法,不过,Java 8是Oracle 公司于 2014 年 3 月 18 日发布的,距离今天已经过了近十年的时间了,Java并没有就此止步,而是继续不断发展壮大,几乎每隔6个月,就会冒出一个新版本,最新的版本已经快要迭代到Java 20了,与Java 8相差了足足十来个版本,但是由于Java 8的稳定和生态完善(目前仍是LTS长期维护版本),依然有很多公司在坚持使用Java 8,不过随着SpringBoot 3.0的到来,现在强制要求使用Java 17版本(同样也是LTS长期维护版本),下一个Java版本的时代,或许已经临近了。
冷环渊
2022/12/15
7190
青空の霞光Java新特性笔记
Java9-Java17新特性
​ 因为编程语言千千万,他们就像一个生态系统一样,新的语言会出现,旧的语言会被取代,除非它不断地演变,能跟上节奏;同理,Java也是取代了竞争对手语言,且根据编程市场不断演变才能一直存活的。
yuanshuai
2023/11/17
6870
Java9-Java17新特性
Java新特性
随着SpringBoot 3.0的到来,现在强制要求使用Java 17版本(同样也是LTS长期维护版本)
用户9645905
2023/11/03
2600
Java新特性
JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK15特性讲解】
2020年9月15日,java15正式发布,(风平浪静的一个版本)共有14个JEP,是时间驱动形式发布的第六个版本.相关文档: https://openjdk.java.net/projects/jdk/15/
用户4919348
2022/12/15
1.1K0
JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK15特性讲解】
追随 Kotlin/Scala,看 Java 12-15 的现代语言特性
Java 14 发布已经过去了三个月,Java 15 目前也已经到了“Rampdown Phase One ”阶段,其新特性均已敲定。由于 12-15 都是短期版本,无需考虑也不应该将其用于生产环境。但可以提前了解新特性,以免在下一个 LTS(Java17)正式发布时毫无心理准备。Java 12-15 引入了一系列改进,本文只讨论语言层面的新特性,它们看起来似曾相识——没错,这些特性让人感觉 Java 在沿 Kotlin/Scala 走过的路线前行。
bennyhuo
2020/06/30
1.4K0
《JDK17新特性和代码案例演示》
🐯猫头虎博主在此! 本篇文章深入挖掘了JDK 17的新特性并通过代码案例为大家展示了如何使用这些新特性。对于所有希望在Java开发中保持前沿技术的小伙伴来说,这是一篇不容错过的文章。你想了解JDK 17吗?想知道它与JDK 8有何不同吗? JDK 17新特性,JDK 17代码案例。
猫头虎
2024/04/09
5340
推荐阅读
相关推荐
Java8 之后对新开发者非常友好的特性盘点
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验