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

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

作者头像
用户3147702
发布于 2022-12-21 09:57:10
发布于 2022-12-21 09:57:10
34230
代码可运行
举报
运行总次数: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 删除。

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

评论
登录后参与评论
3 条评论
热度
最新
这文档没有价值,存在误导
这文档没有价值,存在误导
回复回复点赞举报
ztm 垃圾文档
ztm 垃圾文档
回复回复点赞举报
找不到这个界面啊。。路径在哪
找不到这个界面啊。。路径在哪
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
腾讯云服务器宝塔8888端口开放教程(安全组开启)
腾讯云服务器安装宝塔面板,宝塔面板依赖8888、888、80、443、20和21端口,如果云服务器安全组没有放通8888|888|80|443|20|21端口,需要在安全组中开启,否则无法正常使用宝塔面板,腾讯云服务器( txyfwq.com )网来详细说下腾讯云服务器安全组开启宝塔面板8888端口教程:
Past
2022/04/22
54.5K2
腾讯云CVM服务器和轻量服务器开通80端口流程(图文解析)
腾讯云服务器怎么放通80端口?腾讯云服务器分为云服务器CVM和轻量应用服务器,CVM云服务器在安全组中配置规则开启80端口,轻量应用服务器在防火墙中开通80端口,腾讯云百科来详细详细说下腾讯云服务器开通80端口教程:
上云小秘书
2023/04/01
11.2K0
腾讯云CVM服务器和轻量服务器开通80端口流程(图文解析)
Web项目部署到腾讯云服务器
由于我用的是maven项目,开发工具是IntelliJ IDEA 2019.3.3 x64,所以直接 点击下图中的package即可
别团等shy哥发育
2023/02/25
11.9K0
Web项目部署到腾讯云服务器
腾讯云服务器如何设置安全组?
入站规则:表示允许到达与安全组相关联的云服务器的入站流量。 出站规则:表示离开云服务器的出站流量。
云上云
2019/07/02
51.5K0
腾讯云服务器如何设置安全组?
如何使用腾讯云服务器搭建个人网站?
从刚开始的简单学习HTML语言,到进入实验室跟着老师,学长学习Java,Android,这一年收获很多,这并不是说我的编程能力得到了多高的提升,而是我认为自己的思路变得和以前不一样了,学会了很多解决问题的实际技巧,明白了思路远远比答案更重要,虽然这个学期离开了实验室,很遗憾,但一年的经历让我在解决其他问题的时候同样受益匪浅。在这个时候写这篇博客也是给自己一个交代,还记得当时学习编程的目的就是要做一个自己的网站出来,那个时候觉得做出来一个网站是多么的遥不可及,现在,时间把梦想变成现实。------谨以此文献给和我去年一样懵懂又对建站充满幻想的同学!
用户5908769
2019/07/28
21.2K0
如何使用腾讯云服务器搭建个人网站?
【图文教程】云服务器上,Linux安装VSFTPD组件及遇到的问题
服务器做迁移,从AXX云迁移到Txx云上,迁移的话,需要把图片服务器也迁移过去。之前使用的是VSFTPD这次也还用这个吧。这里就记录下FTP服务器安装及遇到的问题。
凯哥Java
2023/01/12
1.5K0
【图文教程】云服务器上,Linux安装VSFTPD组件及遇到的问题
腾讯云服务器从购买到入门使用流程 新手必看教程
点我打开腾讯云首页》产品》热门》云服务器,选好cpu、内存、带宽,地域,这几个是主要的。其他都可以默认选择。
云优惠
2019/09/10
3.2K0
腾讯云服务器从购买到入门使用流程 新手必看教程
用腾讯云服务器搭建属于你的AdGuard Home与AdGuard Home的设置
用SSH工具连接服务器,在终端按顺序输入如下命令即可手动编译安装AdGuard Home
MoraEX
2022/04/08
18.1K3
用腾讯云服务器搭建属于你的AdGuard Home与AdGuard Home的设置
腾讯云轻量应用服务器配置及建网站教程
腾讯云轻量应用服务器如何使用?新手站长以搭建WordPress为例,使用宝塔镜像,先在防火墙开通端口。腾讯云百科来详细说下腾讯云服务器从购买、配置到网站上线全流程,包括轻量服务器配置选择、应用镜像选择、重置密码、防火墙开放端口教程等详细教程:
用户9264446
2022/08/10
9.4K0
腾讯云轻量应用服务器配置及建网站教程
web部署到腾讯云服务器
怎样将本地web项目部署到腾讯云服务器上?首先需要有一台腾讯云服务器 腾讯云服务器地址 https://cloud.tencent.com/act 1.本地计算机的工作: (1).用eclipse新建
用户5908769
2019/07/26
21.3K0
web部署到腾讯云服务器
腾讯云服务器购买了不会搭建环境怎么办?官方教程+镜像市场助你轻松上云
现在有很多传统虚拟主机用户和物理服务器用户都在慢慢的将网站迁移至腾讯云服务器,但是有很多用户不懂怎么给腾讯云服务器安装网站程序运行所必要的环境,同时又没有相应的技术支持人员,而花钱请人安装环境有担心安全和成本过高,这就导致了部分用户在网站迁移至云服务器的时候有些犹豫。
tengxunyun8点com活动整理
2019/11/27
10.9K0
腾讯云服务器购买了不会搭建环境怎么办?官方教程+镜像市场助你轻松上云
腾讯云服务器国际版如何安装?
在腾讯云国际版(Tencent Cloud International)安装云服务器(CVM)的流程与国内版类似,但注册、支付、数据中心选择等细节有所不同。以下是详细步骤:
用户11534092
2025/02/27
3830
腾讯云服务器国际版如何安装?
服务器篇——如何搭建一个属于你的博客
很久很久以前,我还是选择虚拟主机的,但是现在还是选择服务器好一点,也方便一点,而且价格也贵不到哪里去,腾讯云现在活动100元一年,自己建个博客绰绰有余了,还可以做点其他的学习之用,(但是这些活动服务器都是国内的,如果需要搭建网站的话就必须备案了,不过备案现在也不麻烦,本站lanol.cn从开始备案到备案成功也就一个星期左右)。
SingYi
2022/07/14
1.9K0
服务器篇——如何搭建一个属于你的博客
【玩转服务器】如何设置服务器安全组
服务器在接入互联网后只需放行指定端口满足业务即可,这样可以大大提升服务器的安全性。腾讯云提供在操作面板中设置安全组,方便高效的提供服务器安全性。
参谋带个长
2023/06/09
4.3K0
腾讯云服务器CVM+CentOS,部署LAMP环境快速搭建WordPress博客
基于腾讯云服务器CVM+ CentOS,部署LAMP环境快速搭建WordPress个人博客。
就要上云
2020/10/01
1.1K0
腾讯云服务器CVM+CentOS,部署LAMP环境快速搭建WordPress博客
腾讯云服务器搭建挂机宝教程(图文教程)
比如说我现在玩的DNF。我相信大多数人都会玩。而且玩的也不错。但是碍于国服的比例。很多人都不屑于去玩。可是你们想没想过。国服的比例不好。韩服的呢?美服的呢?甚至日服。台服?
用户6592925
2019/10/30
28.8K0
腾讯云服务器搭建挂机宝教程(图文教程)
腾讯云服务器ping不通解决方法(公网IP/安全组/系统多维度)
腾讯云服务器ping不通什么原因?ping不通公网IP地址还是域名?新手站长从云服务器公网IP、安全组、Linux系统和Windows操作系统多方面来详细说明腾讯云服务器ping不通的解决方法:
用户9264446
2022/12/01
2.5K0
腾讯云服务器ping不通解决方法(公网IP/安全组/系统多维度)
腾讯云服务器怎么用,将web项目部署到腾讯云服务器上流程
(1).用eclipse新建一个web项目,然后在webcontent下新建一个index.html,然后在本地部署到Tomcat服务器下,打开浏览器看是否能访问本地项目.
tengxunyun8点com活动整理
2019/04/26
22.7K0
腾讯云服务器怎么用,将web项目部署到腾讯云服务器上流程
手把手教你购买腾讯云服务器
腾讯云是腾讯公司旗下的云计算服务提供商,提供一系列基础设施和云服务,涵盖了计算、存储、数据库、人工智能、大数据分析、物联网等领域。腾讯云在全球范围内建立了多个数据中心,提供多地域、多可用区的服务支持,为用户提供高可靠性和稳定性的服务。它还提供灵活的付费模式和全面的技术支持,适应了各种规模和类型的用户需求。这里我们将手把手教你如何快速购买腾讯云服务器。
无代码Dev
2024/01/26
2.1K0
手把手教你购买腾讯云服务器
腾讯云服务器自建《幻兽帕鲁》服务器详细教程
幻兽帕鲁太火了,官方palworld服务器不稳定?不如自建服务器,基于腾讯云幻兽帕鲁服务器成本32元全自动部署幻兽帕鲁服务器,超简单有手就行,全程自动化一键部署10秒钟即可搞定,无需玩家手动部署幻兽帕鲁游戏程序,腾讯云百科分享详细新手0基础搭建幻兽帕鲁服务器教程:
用户9264446
2024/02/07
2.3K0
腾讯云服务器自建《幻兽帕鲁》服务器详细教程
推荐阅读
相关推荐
腾讯云服务器宝塔8888端口开放教程(安全组开启)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验