Java18都在路上了,你还在用Java8吗?

我的java16和java8冲突解决办法(java版本冲突解决方法) 我的java16和java8冲突解决办法 我的问题 vscode 支持java11以上 burpsuite 支持java11以上 cknife 只能java8 JEB 只能java8 全局变量设置java16的路径 对于java8 直接把只支持java8的文件目录放到java8中 在这里中用的是java8,这个目录有java文件 这个脚本可以自动隐藏窗口打开一个文件,避免每次都留下一个黑框 @echo off if "%1" == "h" goto begin mshta vbscri 阅读详情

Java18都快推出了,还有很多的小伙伴可能还在用Java8,可能还不知道很多高版本提供的一些好用的特性,下面我整理了一下从Java9~Java17中我个人觉得一些比较实用的特性,让大家在推动公司Java版本的升级时有更多的理由。

可能很多公司会为了“稳定性”而拒绝升级高版本的JDK,就和以前Java8刚推出时,还在用JDK1.6的人拒绝升级一样。但实际上是有多少是真的为了稳定性,还有多少只是公司单纯的拒绝新的技术,这谁知道呢?^ _ ^

一些特性

JEP 286: Local-Variable Type Inference(Java11)

变量类型推导,可以让我们在使用局部变量时,使用var关键字来定义一个变量:

var list = new ArrayList<String>();
复制代码

这个算是一个我比较喜欢且最常用的一个特性了,可以显著的简化代码,但是也会带来一个问题:可读性下降。该如何使用,看个人权衡了。

JEP 358: Helpful NullPointerExceptions(Java14)

我相信大部分人的处理NPE时都会遇到的一个令人头疼的问题,那就是报NPE的那行是一个链式调用,比如:

class Main {
    public static void main(String[] args) {
        var x = a().b().i.j;
    }
}
Exception in thread "main" java.lang.NullPointerException:
    at Main.main(Main.java:3)
复制代码

这样的NPE异常毫无指向性,你可能根本不知道是哪个方法或变量报的异常。而在Java14及以后,NPE将会变得更加有的指向性,还是同样的代码,在Java14中的异常则会是:

Exception in thread "main" java.lang.NullPointerException:
	Cannot read field "j" because "i" is null
    at Main.main(Main.java:3)
复制代码

这可以让我们在排查问题时,可以更清晰的定位问题。

JEP 361: Switch Expressions(Java14)

更优雅、更简洁的Switch表达式,再也不用写一堆的CASE/BREAK 了

switch(month) {
    case 1,3,5,7,8,10,12 -> System.out.println("31");
    case 4,6,9,11 -> System.out.println("30");
    case 2 -> System.out.println("28");
};
复制代码

switch也可以当作表达式使用,即可以提供返回值:

var x = switch(condition) {
    case A -> "a";
    case B -> "b";
    default -> "none";
};
复制代码

新增的yield关键字还可以让你在表达式中处理一大段的代码块:

var x = switch(condition) { 
    case A -> "a";
    case B -> "b";
    default -> {
	Sytem.out.println("in default");
	//do something else
	var result = doSomething();
	yield result;
    }
};
复制代码

JEP 378: Text Blocks(Java15)

终于终于终于可以不用在字符串中处理一堆的反斜杆,\n, +号拼接了!!
简单的看一个对比:

var script = "function hello() {\n" +
                         "    print('\"Hello, world\"');\n" +
                         "}\n" +
                         "\n" +
                         "hello();\n"
复制代码

Java15及以后:

var script = """
		function hello() {
        	    print('"Hello, world"');
    		}
                        
    		hello();
	     """
复制代码

可读性相差太多了,如此简单、常用的基础能力,早就应该提供了!你也可以像和普通字符串一样,使用占位符和format方法。

JEP 395: Records(Java16) 数据类,有点类似于Kotlin中的data object. 可以使用下面的方式来定义一个数据类:

public record Data(int x, int y) {
}
复制代码

这个类会默认实现hashCode()、equals()和toString()方法,并且这个类被被定义为final,并且不可变:字段初始化后即不可再修改。在类里面也可以定义普通或静态方法。

在我们需要返回一些不可变的数据给外部使用时,可以使用record来定义数据格式,在SpringBoot 2.5.0-M1之后(或者升级jackson版本),也提供对Java16的支持,这意味着你可以在spring部分场景中使用,比如controller接收参数时,参数可以是一个record类。

JEP 394: Pattern Matching for instanceof(Java16)

模式匹配,或者说是类型匹配,这也是在Kotlin中已有的功能,可以让我们在编码时少做一些强制类型转换的工作:

if (obj instanceof String) {
    String s = (String) obj;
    s.toLowerCase();
}
复制代码

Java16及以后:

if (obj instanceof String) {
    //自动类型推导
    obj.toLowerCase();
}

//甚至可以这么用
var isGood = obj instanceof String && obj.trim().toLowerCase().equals("good");
复制代码

怎么说呢,在一些场景下,一直做类型强制转换也是挺麻烦的一件事情,这个特性起码可以减少一些编码的工作量。

JEP 409: Sealed Classes(Java17)

提供一种新的约束条件给类或接口,这个一般场景下可能用不上,但是让我们需要写一个框架,或者需要写一个SDK给其它部门或者用户使用的时候,这个特性就可以派上用场了。举个栗子:

public abstract sealed InnerAbsClass permits InnerClassA, InnerClassB {
}
复制代码

当一个类被sealed修饰之后,那么只有被permits关键字指定的名可以继承这个抽象类,其它的类如果尝试继承这个抽象类则会在编译时就会报异常。

还有一种方式是不使permits关键字,那么就只能在同个文件内定义子类:

public abstract sealed InnerAbsClass {
}
public final InnerClassA extends InnerAbsClass {}
public final InnerClassB extends InnerAbsClass {}
复制代码

接口也可以使用同样的方式来定义。

为什么不使用“包访问权限”来限制继承或实现?有些场景我们虽然希望父类不被外部使用者所继承,但是同时也希望他可以被访问,比如提供了一些静态的变量、静态方法可以被外部使用。

总结

上面并不是所有的特性,但是是我个人实际使用过,也觉得确实好用,提高了生产力的一些功能,也分享给大家,说不定还在使用低版本Java的人看到了之后,也决定推动公司升级了呢。 而且Java17是Oracle提供的一个长期支持版本,最多可以支持到 2029年9月份,长达8年的支持起码也可以保障它的稳定性。

最后,追求稳定没有任何问题,但是拥抱新的变化也不错~

Intouch实时报警 Intouch实时报警功能的相关设置 阅读详情

相关推荐

告别报错!Win10下Autodock Vina 1.2.3保姆级安装与避坑指南

本文提供了Win10系统下Autodock Vina 1.2.3的完整安装与实战指南,涵盖环境配置、分子文件预处理、对接参数优化及结果分析等关键步骤。通过详细的避坑技巧和优化方案,帮助用户高效完成分子对接任务,特别适合生物信息学研究人员和药物发现领域的初学者。

weixin_29969209的博客 402

从 Java 8 到 Java 18 的新语言特性

在20年,我们说如果要大规模升级java版本,要等到2022年之后,嗯……今年是 2023 年。而且 2022 年发布的 Spring Framework 6.0、SpringBoot 3.0 所支持的最低 java 版本为 java 17,所以今年升级 JDK 版本还是一个不错的选择的,之后我们也会升级来体验一下 JDK 17。今天先来看下有哪些更新。

不定时分享最优质的网络技术与教程,满满的干货。 1417

NPP/VIIRS夜间灯光数据:从下载到应用的完整指南

本文提供了NPP/VIIRS夜间灯光数据从下载、处理到应用的完整实战指南。详细介绍了如何从官方源获取数据、解读文件结构、进行坐标校正与数据清洗,并深入探讨了其在城市扩张监测、社会经济指标估算、重大事件影响评估等领域的核心应用。文章旨在帮助研究者与从业者快速掌握这一强大的空间数据,将其转化为研究中的实用工具。

gpu4optimizer的博客 862

jdk1.8和jdk18的区别

JDK 1.8(也称为Java 8)和JDK 18是Java开发工具包(Java Development Kit)的两个不同版本。虽然它们都是JDK,但由于发布时间相差多年,它们在功能、性能、语言特性和工具支持等方面有显著差异。以下是它们的主要区别:

qq_45693549的博客 8299

AISHELL-2 中文语音数据库

AISHELL-1 is by far the largest open-source speech corpus available for Mandarin speech recognition research. It was released with a baseline system containing solid training and testing pipelines for Mandarin ASR. In AISHELL-2, 1000 hours of cle

AI_SHELL的博客 7887

STM32实战:5分钟搞定MXL90614红外测温模块的I2C驱动(附完整代码)

本文提供了一份快速集成MLX90614红外测温模块的STM32实战指南。通过详细的软件I2C驱动代码,重点解析了SMBus通信协议、CRC校验及温度数据转换,帮助开发者避开常见陷阱,实现5分钟内完成模块驱动并读取准确温度值。

wasm7browser的博客 353

拥抱变化,面向Java17,Java8-18全系列特性详解_jdk18和java8(1)

和} );

2401_84166327的博客 372

K型热电偶负电压采集难题?3种运放电路设计方案对比(含Multisim仿真)

本文针对K型热电偶在低温测量中产生的负电压采集难题,详细对比了三种运放电路设计方案,包括双电源运放反相放大、单电源仪表放大器和差分放大电路,并结合Multisim仿真数据分析了各方案的性能差异。文章还提供了PCB布局和抗干扰设计的实战技巧,帮助工程师解决热电偶信号采集中的核心挑战。

postgres8guard的博客 1018

idea本地启动DataEase项目详细步骤

core 是前后端主要代码,drivers 为动态加载的数据库驱动,mapFiles 为系统内使用的genJson地图资源,sdk 为项目公共库,staticResource 为后端的静态资源库。

MXDMAX的博客 4088

时间序列分析:ARCH、GARCH、TGARCH与DCC-GARCH波动率模型(含代码)

关注TGARCH模型和DCC-GARCH的应用,通过在沪深300和中证500指数上应用TGARCH和DCC-GARCH模型,揭示这两个指数之间的条件异方差及动态相关性的变化规律。

celiaweiwei的博客 1万+

『OPEN3D』1.2 mesh处理 python篇

介绍open3d对mesh的基本处理操作

NNNNNathan的博客 4648

Java18都在路上了,你还在用Java8吗

Java18都快推出了,还有很多的小伙伴可能还在用Java8,可能还不知道很多高版本提供的一些好用的特性,下面我整理了一下从Java9~Java17中我个人觉得一些比较实用的特性,让大家在推动公司Java版本的升级时有更多的理由。 可能很多公司会为了“稳定性”而拒绝升级高版本的JDK,就和以前Java8刚推出时,还在用JDK1.6的人拒绝升级一样。但实际上是有多少是真的为了稳定性,还有多少只是公司单纯的拒绝新的技术,这谁知道呢?^ _ ^ 一些特性 JEP 286: Local-Variable

qfchenjunbo的博客 272

光通量与辐射通量之间的换算

由理论和实验可知存在两种定义: 1W1W1W(瓦特)的频率为540×1012Hz540\times10^{12}Hz540×1012Hz(赫兹)的单色辐射的辐射通量等于683lm(流明)683lm(流明)683lm(流明).。 1lm1lm1lm的频率为540×1012Hz540\times10^{12}Hz540×1012Hz的单色通量等于1683=0.001464W\frac{1}{683}=0.001464W6831​=0.001464W。 从上述定义中我们可以得到什么呢?我们知道光速: c=3×

u011699626的博客 3271

从8k到现在的18k,我这一年到底经历了什么

枫哥:“我这一年都在学习,我就没有停过,一年365天,我想想我自己都吐了,图啥呀,我来杭州一年,我都没有出去玩过。。” 这是这个老弟跟我吐槽的原话,我原封不动的发出来了。 我将这个整理出来,也是希望给更多的迷茫的人看到,不要放弃,也不要纠结,努力肯定会有回报的。可能会迟到,但是一定不会缺席!

IT枫斗者的博客 568

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java18_Oracle官方宣布 Java 11(18.9 LTS) 正式发布

有多少语言在提刀想反超Java的路上?但万万没想到,人家并未当回事,如今这款常青藤甚至越跑越欢,当我们还在使用Java7/8时,它已经一路跑到了11。和预期的时间差不多,北京时间9月26日,Oracle官方宣布Java11(18.9LTS)正式发布,可供生产环境中使用,此次版本的更新,不仅提高了工作效率,也提供了HTTP/2ClientAPI。同时,这也是自Oracle宣布以六个月为周期更新后发布...

weixin_42524171的博客 986

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

不断收集一些不错的博客(献给未来路上的人)

收集一些不错的博客 1.Java 自带性能监控工具:监视和管理控制台 jconsole 的使用

weixin_43495390的博客 3万+

JAVA学习成长之路-------致成长路上的Coding们

JAVA成长路上从来不缺导师、领路人。 凡事预则立,不预则废。 制定java的学习路线才能走的更快 一、Java 基础 1.JDK 和 JRE 有什么区别? 2.== 和 equals 的区别是什么? 3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗? 4.final 在 java 中有什么作用? 5.java 中的 Math.round(...

weixin_30487317的博客 85

华为18级架构师给开发10年内Java程序猿的151条建议

最近华为18级的大神架构师在采访中说:那些所谓的架构师、设计师、项目经理、分析师们,已经有多长时间没有写过代码了?代码是一切的基石,我不太信任连“Hello World"都没有写过的架构师。看看我们软件界的先辈们吧,Dennis M. Ritchie决定创造-一门“看上去很好”的语言时,如果只是站在高处呐喊,这门语言是划时代的,它有多么优秀,但不去实现,又有何用呢?没有Dennis M.Ritchie的亲自编码实现,C语言不可能诞生,UNIX操作系统也不可能诞生。Linux 在聚拢成千上万的开源狂热者对它进

Java0258的博客 812

java 18.9_Oracle官方宣布 Java 11(18.9 LTS) 正式发布

描述有多少语言在提刀想反超 Java的路上?但万万没想到,人家并未当回事,如今这款常青藤甚至越跑越欢,当我们还在使用 Java 7/8 时,它已经一路跑到了 11。和预期的时间差不多,北京时间 9 月 26 日,Oracle 官方宣布 Java 11(18.9 LTS) 正式发布,可供生产环境中使用,此次版本的更新,不仅提高了工作效率,也提供了HTTP/2ClientAPI。同时,这也...

weixin_29597551的博客 246

我叫LD,我是PM,我在路上

今天看到一片文章《我是艺术家》,颇有感受,忍不住想给自己也做个自我表述,当时涌上心头的词就是:我叫LD,我是PM,我在路上,那就用它来做我这篇自述的标题吧。     我81年出生在湖南的一个普通小镇,童年的岁月在父亲工作的大院的里度过,87年在母亲工作的中心小学读书,92年因为父亲的单位迁移到HY市而转学到子弟小学读书,93年上市重点初中,96年上省重点高中。在我18岁前的生命中,除了学习成绩不

步人甲.CHN 2850

成为或者转行成为Java开发者路上的各种心态问题

7. 在学习编程的过程中,对代码理解不深刻,感觉只是在死记硬背。8. 完成一段时间学习后,感觉没有明显的进步,产生挫败感。46. 在面临多个任务和项目时,难以进行有效的多任务处理。50. 在考虑转行时,对于放弃现有职业积累的经验感到不舍。9. 对于未来就业市场的需求和自己的就业方向感到不确定。2. 怀疑自己的决定,思考是否选择了正确的职业道路。12. 面对错误和失败时,缺乏解决问题的耐心和决心。14. 在学习新技术时,难以适应快速变化的学习曲线。44. 在编码时,难以坚持遵循良好的开发习惯和实践。

youmashengyue的博客 423

Ubuntu 18.04 部署 Tomcat 9 生产就绪实践指南

Tomcat 是 Java Web 应用最主流的开源 Servlet 容器,其部署与配置直接关系到系统稳定性、安全合规与运维可审计性。在 Linux 环境中,尤其是长期支持但已进入 ESM 阶段的 Ubuntu 18.04,二进制包手动部署成为保障版本可控、权限隔离和 JVM 深度调优的关键路径。该方式规避了 apt 包的路径硬编码、多实例冲突与安全加固受限等问题,支持 CATALINA_HOME/CATALINA_BASE 分离、专用系统用户管理、HTTPS 双向认证及 systemd 服务精细化控制。结

weixin_30709061的博客 347
上一篇: 扒一扒Lombok的@Slf4j注解,我发现还有点意思。
下一篇: 21张图搞懂Git的原理
superjava_
博客等级 码龄5年 254粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值