7个理由:从Java8升级到Java17【翻译】

news2024/12/21 22:16:24

原文地址: 7 Reasons to Migrate from Java 8 to Java 17

释放吧,Java的全部力量。[手动狗头]

简介

从Java8到Java18,Java已经经历了漫长的发展历程(Java20非长期维护版本)。同时也是从Java 8开始,Java生态系统发生了许多变化。其中最明显的变化是Java版本发布节奏的改变。Java 8于2014年发布,而Java 17则是在2021年发布的,这两个版本之间相差了7年的时间。然而,2017年9月,Java 平台的主架构师 Mark Reinhold 发出提议,要求将 Java 的功能更新周期从之前的每两年一个新版本缩减到每六个月一个新版本。该提议获得了通过,并在提出后不久生效。因此对于Java生态系统的开发者而言,可以更快的使用上Java最新的版本功能。

如果你像我一样,已经使用了很长时间的Java 8,并且觉得自己需要学习Java的新功能,那么这篇文章就是为你准备的。

从Java8开始,有许许多多的新功能被添加到了JDK中,但是很明显不是所有的功能都有用,好用,受大家的欢迎。所以,我在本文中列出了从Java8开始最受Java程序员欢迎的功能,你可以将本文作为一个学习的参考,同时,学会了可以找你同事吹吹牛逼。

关键功能

1.Local Variable Type Inference[局部变量类型推断]

局部变量类型推断可以说是Java8以来添加的最受欢迎的功能了,它允许你在不指定类型的情况下声明局部变量。实际代码执行时候的类型是通过表达式右侧的内容推断出来的,该功能也称之为var类型。(没错,逐渐Js化)。

例如:var a = 1

Java8 使用局部变量

URL url = new URL("https://www.baidu.com");
System.out.println(url.getClass());

Java10 有了局部变量类型推断后

var url = new URL("https://www.baidu.com");
System.out.println(url.getClass());

上面的代码最终的输出是完全一样的,但是很明显,在Java10以后不需要声明具体的局部变量类型。

ps: Java8中lombok提供了类似的功能,也是var,只不过需要导包。

import lombok.var;
import org.junit.jupiter.api.Test;
​
import java.net.MalformedURLException;
import java.net.URL;
​
//使用 lombok
public class JdkTests {
    @Test
    public void test1() throws MalformedURLException {
        var url = new URL("https://www.baidu.com");
        System.out.println(url.getClass());
    }
}

2.switch expression[switch表达式增强]

在Java 14中使用switch表达式时,你不必使用break关键字来跳出switch语句,也不必在每个switch case上使用return关键字来返回一个值;相反,你可以返回整个switch表达式。这种增强的switch表达式使整个代码看起来更干净,更容易阅读。

Java8中使用switch

int flag = 1;
​
switch(flag) {
    case 1:
        System.out.println("hello");
        break;
    case 2:
        System.out.println("world");
        break;
    case 3:
        System.out.println("hello world");
        break;
    case 4:
        System.out.println("hello");
        break;
    default:
        System.out.println("haha");
}

Java14后使用switch

int flag = 1;
switch(flag) {
    case 1,4 -> System.out.println("hello");
    case 2 -> System.out.println("world");
    case 3 -> System.out.println("hello world");
    default -> System.out.println("haha");
}

3.Text blocks[文本块]

文本块是Java 15中出现的一个新特性,它允许你在不使用转义符号的情况下创建多行字符串。在代码中写Json并且还想换行的时候就非常舒服。通过下面的例子,你可以看到如果使用了文本块,代码会变得多么的简洁和舒服。

Java8中

String json = "{\n" +
        "  "id": 3,\n" +
        "  "username": "fake_data",\n" +
        "  "password": "fake_data",\n" +
        "  "ips": [\n" +
        "    "fake_data"\n" +
        "  ],\n" +
        "  "firstLoginTime": 29,\n" +
        "  "lastLoginTime": 69,\n" +
        "  "failedAttempts": 62,\n" +
        "  "lockedUntil": "2013-11-20 20:23:23"\n" +
        "}";

Java15之后

String json = """
    {"id": 3, 
    "username": "fake_data", 
    "password": "fake_data", 
    "ips": ["fake_data"], 
    "firstLoginTime": 29, 
    "lastLoginTime": 69, 
    "failedAttempts": 62, 
    "lockedUntil": "2013-11-20 20:23:23"}
""";
System.out.println(json);

4.Records[record类]

record类是Java14引入的一个新的声明类的方式(之前之后class)。通过该关键字你可以用更少的代码创建一个类似于POJO的类(害,就是个普通的Java类,譬如 User类,Student类等,或者叫实体类也行,不需要分的很细致)。相较于以往,在此之前大多数开发者使用Lombok来简化POJO类的写法(不需要写get set之类),但现在,使用了record,你不需要使用任何第三方库,就可以将代码写的更加简洁。在下面的例子中,你可以看到用record代码会多么的简洁。

Java8

public class User {
    private String name;
    private String password;
​
    public User() {
​
    }
    
    public User(String name, String password) {
        this.name = name;
        this.password = password;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public String getPassword() {
        return password;
    }
​
    public void setPassword(String password) {
        this.password = password;
    }
}

Java8使用lombok

@AllArgsConstructor
@NoArgsConstructor
@Data
public class User {
    private String name;
    private String password;
}

使用record

public record User(String name,String password) {}

测试代码

@Test
public void test7() {
    User user = new User("2","3");
    System.out.println(user.name());
}

5.Pattern matching for instanceof[instanceof模式匹配]

instanceof模式匹配是Java 16中加入的一个新特性。它允许你将instanceof操作符作为一个表达式来使用,并返回被转换的对象(不需要强转了)。在处理嵌套的if-else语句时非常有用。在下面的例子中,你可以看到我们是如何使用instanceof操作符来return Employee对象的,而不使用强转。

Java8

if (obj instanceof Employee){
    Employee emp = (Employee)obj;
    return emp.getName();
}

使用instanceof模式匹配

if (obj instanceof Employee emp){
    return emp.getName();
}

6.Sealed classes[密封类]

封闭类是Java 17中加入的一个新特性。它允许你将一个类或接口的继承限制在一组有限的子类中。简单来说就是,你有一个 UserService接口,只想要被 UserServieImpl 实现,以前是不能限制的,现在有了Sealed classes特性之后就可以了,那么具体如何做到呢?

通过 sealed 修饰符来描述某个类为密封类,同时使用 permits 关键字来制定可以继承或实现该类的类型有哪些。注意 sealed 可以修饰的是类(class)或者接口(interface),所以 permits 关键字的位置应该在 extends 或者 implements 之后。

例子:

使用sealed声明一个UserService只能够被UserServiceImpl,UserServiceFinalImpl实现。

public sealed interface UserService permits UserServiceImpl, UserServiceFinalImpl{
}

想要实现sealed声明的接口(继承类也一样),子类,或者实现类,需要用final或者non-sealed修饰。

public final class UserServiceFinalImpl implements UserService{
}
​
public non-sealed class UserServiceImpl implements UserService{
}

上面两者的区别在于:

final修饰的实现类不能被进一步继承,而一个non-sealed修饰的实现类可以被进一步继承。

//进一步继承
public class UserServiceImplNonSealed extends UserServiceImpl{
}

7.Useful NullPointerException

NullPointerExceptions是Java 14中加入的一个新功能。它允许你获得更多关于NullPointerExceptions的信息。这在你调试NullPointerExceptions时非常有用。在下面的例子中,你可以看到同样的代码在Java 8和Java 14中产生了不同的NullPointerExceptions,但在Java 14中,你可以得到更多关于异常的信息。 (看到更多的异常栈信息,能够更好的进行bug定位)

image.png

小结

本文中我还没有涵盖Java 17以来增加的所有功能,但我已经涵盖了最受欢迎的功能。如果你想了解更多关于Java的新功能,那么我建议你去看看下面提供的链接。

References

  • JDK 10 features — https://openjdk.org/projects/jdk/10/
  • JDK 11 features — https://openjdk.org/projects/jdk/11
  • JDK 12 features — https://openjdk.org/projects/jdk/12
  • JDK 13 features — https://openjdk.org/projects/jdk/13
  • JDK 14 features — https://openjdk.org/projects/jdk/14
  • JDK 15 features — https://openjdk.org/projects/jdk/15
  • JDK 16 features — https://openjdk.org/projects/jdk/16
  • JDK 17 features — https://openjdk.org/projects/jdk/17

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/653315.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LeetCode热题100】打卡第23天:最小覆盖子集

文章目录 【LeetCode热题100】打卡第23天:最小覆盖&子集⛅前言 最小覆盖🔒题目🔑题解 子集🔒题目🔑题解 【LeetCode热题100】打卡第23天:最小覆盖&子集 ⛅前言 大家好,我是知识汲取者&…

三种方法将Word文档转换为PDF文件格式

如何将Word文档转换为PDF文件格式呢?大家在传输文件时,很多人喜欢使用PDF文件格式,因为它非常稳定,不会出现格式混乱的问题。但有些人可能不知道如何进行转换,今天我将介绍三种转换方法,让我们一起来学习一…

从0开始,精通Go语言Rest微服务架构和开发

说在前面 现在拿到offer超级难,甚至连面试电话,一个都搞不到。 尼恩的技术社区中(50),很多小伙伴凭借 “左手云原生右手大数据”的绝活,拿到了offer,并且是非常优质的offer,据说年…

Pytest教程__Hook钩子函数总结(14)

前言 pytest 的钩子函数有很多,通过钩子函数的学习可以了解到pytest在执行用例的每个阶段做什么事情,也方便后续对pytest二次开发学习。 详细文档可以查看pytest官方文档API Reference — pytest documentation 钩子函数总结 第一部分:set…

5、DuiLib组件结构的初探

文章目录 1、DuiLib组件结构的初探 1、DuiLib组件结构的初探 DuiLib 整体的实现不仅仅有控件,还有窗口消息、XML处理等模块,官方曾经过出的一个结构图如下: 图中还是比较详细的描述了 DuiLib 的整体设计,值得注意的部分是 “窗口…

每日一练 | 华为认证真题练习Day61

1、DHCPv6服务器发送的DHCPv6 ADVERTISE报文目的端口号为? A. 548 B. 547 C. 549 D. 546 2、当DHCPv6客户端收到DHCPv6服务器发送的RA报文中的和O标记位取值为下列哪个数值时,DHCPv6客户端采用DHCPv6有状态自动配置获取IPv6地址和其它配置信息&#…

Android libusb库的使用

Download Data Center Software from Total Phase. 1 Aptiv DABR Aptiv acquired Indian Unwired,Delphi Automotive USB Bridge / Hub,Hub中集成了UDC,upstream UDC连接的主机称为A-Host,downstream UDC被B-Host枚举成Relay devi…

一个床垫的故事

这是学习笔记的第 2460篇文章 这是一个床垫的真实故事,想起来还是蛮感慨的,真是太魔幻了。 起因是我哥搬家,有一个很新的品牌床垫,因为新房子那边买家具已经送了一个床垫了,所以就多出来一个床垫,他打算把…

autogpt的使用,还有出现的问题

AutoGPT简介 AutoGPT是一个实验性开源应用程序,展示了GPT-4语言模型的功能。该程序由GPT-4驱动,将LLM“思想”链接在一起,以自主实现您设定的任何目标。作为GPT-4完全自主运行的首批例子之一,AutoGPT突破了人工智能的极限。 注&a…

Opencv-C++笔记 (6) : opencv-图片和视频操作

文章目录 一、读取函数imread二、图片窗口函数namedWindow三、 图片保存Imwrite和显示函数Imshow四、视频数据的读取五、摄像头直接调用 一、读取函数imread cv::Mat cv::imread(const String & filename,int flagsIMREAD_COLOR)filename:需要读取图像的文件名…

Linux运维监控学习笔记4

Zabbix相关的一些概念: Zabbix用户和用户群组: 用户:Zabbix提供多用户管理,不同的用户可以设置不同的权限,不同的语言和不同的报警方式。 1)创建用户:点击“创建用户”按钮: 2&…

NOTA PEG7 Azide,NOTA-七聚乙二醇叠氮,新型双功能整合剂

NOTA PEG7 Azide中NOTA及其衍生物是新型双功能整合剂之一。NOTA及其衍生物具有良好的配位和鳌合能力,可作为过渡金属离子的配体。叠氮化物基团可以参与铜催化的与炔部分的点击化学反应。 聚乙二醇在科研领域运用广泛,聚乙二醇具有良好的水溶性&#xff0…

【FPGA入门】第一篇、Verilog基本语法常识

目录 第一部分、不同的变量类型 1、wire和reg的区别 2、如何对变量进行赋值呢? 3、什么是阻塞?什么是非阻塞? 第二部分、变量位宽的定义 1、各种系统默认情况 2、变量位宽声明方式 3、表明位宽的情况下,赋值方式 4、两个模…

来自一个敲了5年代码的网络安全工程师的自述(目前薪资30K)

本人是一名敲了5年半代码的网络安全工程师,目前在杭州工作,月薪目前是在30.6K左右,经历过两次跳槽,第一次跳槽拿到了12K的offer,第二次跳槽拿到18K的offer。一直到目前为止的30K左右。 说到这里再给大家提个醒&#x…

SpringBoot整合定时任务技术Quartz

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ RequestMapping注解 🚀Quartz应用场…

好消息!PMP证书还没过期的宝子,可以增持免考CSPM-2证书

2021年10月,中共中央、国务院发布的《国家标准化发展纲要》明确提出构建多层次从业人员培养培训体系,开展专业人才培养培训和国家质量基础设施综合教育。建立健全人才的职业能力评价和激励机制。由中国标准化协会(CAS)组织开展的项…

如何使用hexo next主题,新建一个专栏

文章目录 backgroundIntroHow to do that?🎈 background 今天突发奇想,想要在自己的博客中增加一个新的专栏,记录自己的一些随想。起因是不想让博客成为一个纯粹记录技术成长的网站,(毕竟如果真的有人要看…

PostgreSQL(八)锁的相关操作

目录 一、锁存在的意义二、表级锁1.ACCESS SHARE2.ROW SHARE3.ROW EXCLUSIVE4.SHARE UPDATE EXCLUSIVE5.SHARE6.SHARE ROW EXCLUSIVE7.EXCLUSIVE8.ACCESS EXCLUSIVE9.表级锁模式冲突表10.示例一11.示例二 三、行级锁1.FOR UPDATE2.FOR NO KEY UPDATE3.FOR SHARE4.FOR KEY SHARE…

那个准点下班的人,比我先升职了...

前言 二黑最近心态很崩。 和他同期一道进公司的陈琪又升了一级,可是明明大家在进公司时,喜子不论是学历还是工作经验,样样都不如自己,眼下不过短短的两年时间便一跃在自己的职级之上,这着实让他有几分不甘心。 二黑…

Unity 安装负责音频的 wwise

很多游戏的音频用的是 wwise 先下载 https://www.audiokinetic.com/zh/download 安装的时候要选sdk 就是20g的那个 然后运行 选择unity 可以看到这个界面 好,现在开始要安装离线包 直接项目里点 第二个 装好后 他会提示你 无法找到unity安装的地址 1 打开你的 …