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

news/2024/11/30 7:59:41/

从Java8升级到Java17的7个理由

释放吧,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 {@Testpublic 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实现。

 

kotlin

复制代码

public sealed interface UserService permits UserServiceImpl, UserServiceFinalImpl{ }

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

 

java

复制代码

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

上面两者的区别在于:

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

 

scala

复制代码

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

7.Useful NullPointerException

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

小结

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


http://www.ppmy.cn/news/423173.html

相关文章

常见报错01

(1)apt-get:no process found 如果你在使用apt-get命令时出现"apt-get: no process found"错误消息,可能是以下原因之一: 1.没有正在运行的apt-get进程 这个错误通常会在你尝试终止一个没有运行的apt-get…

阿里云服务器的网络性能如何?有多快?是否适合高流量应用?

阿里云服务器的网络性能如何?有多快?是否适合高流量应用?   [本文由阿里云代理商[聚搜云www.4526.cn]撰写]    阿里云服务器网络性能简介   阿里云服务器(ECS)在网络性能方面表现卓越,可满足用户对高…

从零开始搭建群众权益平台(一)

本次的平台我们名为群众权益维护平台,我们将讲解整体的思路,涉及到很多内容,我将给出一份简化的示例,包含了网页的基本结构、前端和后端代码,以及部署的基本步骤。 技术栈使用:HTML,CSS&#x…

ChatGLM-6B云服务器部署教程

目录 一、准备服务器1.购买服务器2.开机进入终端3.进入终端 二、部署ChatGLM1.执行命令2.本地代理访问地址2.1 结果如下2.2 api接口一样操作 三、Fastapi流式接口1.api_fast.py1.2 将api_fast.py上传到服务器 2.准备插件3.访问地址 博客园地址:https://www.cnblogs.…

酷睿处理器型号前面的字母代表什么

酷睿处理器型号前面的字母代表什么? 目前酷睿2双核中,cPu类型还分e系,Q系,t系,X系,P系,L系,u系,s系 e系就是普通的台机的双核cPu,功率65w左右 Q系就是四核cPu…

LIME论文阅读笔记

这是暗图增强领域一篇经典的传统方法论文,发表在TIP这个顶刊 文章基于的是这样一个公式: L R ⋅ T LR\cdot T LR⋅T 其中, L L L是暗图, R R R是反射分量, T T T是illumination map,并且对于彩色图像来说…

分析:如何多线程运行测试用例

这是时常被问到的问题,尤其是UI自动化的运行,过程非常耗时,所以,所以多线程不失为一种首先想到的解决方案。 多线程是针对的测试用例,所以和selenium没有直接关系,我们要关心的是单元测试框架。 unittest …

快速解决Github无法访问的问题

Github访问慢,是困扰很多人的问题,今天就出一个解决方案,按照下面思路,可以实现快速访问Github,来查看我们需要的资源。 目录 一、获取DNS 二、修改hosts文件内容 2.1 修改hosts权限 2.2 修改hosts内容 三、轻…