300 秒快速了解 Java 9 - 16 新特性
来源:互联网
Java 这几年的更新实在是太太太……快了,Java 8 都还没用多久,16 都已经发布了。自从 Java 8 发布了 Lambda 和 Stream 之后,Java 就像打了鸡血一样,半年一个版本的发布,生产队的驴也没这么勤快。导致我们现在完全跟不上 Java 发布的节奏,我司目前还停留在 Java 8,甚至部分老系统还在使用 Java 7,根本不能轻易的升级。不过虽然暂时用不上最新版本的 Java,但了解每个新版本的主要特性还是很重要的,不然哪天真跟着升级了,那还不得一脸懵逼。本文就带你快速了解 Java 9 - 16 的主要新特性,早学完早下班!Java 9(2017年9月)接口里可以添加私有接口Java 8 对接口增加了默认方法的支持,在 Java 9 中对该功能又来了一次升级,现在可以在接口里定义私有方法,然后在默认方法里调用接口的私有方法。这样一来,既可以重用私有方法里的代码,又可以不公开代码publicinterfaceTestInterface{defaultvoidwrapMethod(){innerMethod();}privatevoidinnerMethod(){System.out.println("");}}匿名内部类也支持钻石(diamond)运算符Java 5 就引入了泛型(generic),到了 Java 7 开始支持钻石(diamond)运算符:,可以自动推断泛型的类型:List numbers = newArrayList();但是这个自动推断类型的钻石运算符可不支持匿名内部类,在 Java 9 中也对匿名内部类做了支持:Listnumbers = newArrayList() {...}增强的try-with-resourcesJava 7 中增加了try-with-resources的支持,可以自动关闭资源:try(BufferedReader bufferReader = newBufferedReader(...)) {returnbufferReader.readLine();}但需要声明多个资源变量时,代码看着就有点恶心了,需要在 try 中写多个变量的创建过程:try(BufferedReader bufferReader0 = newBufferedReader(...);BufferedReader bufferReader1 = newBufferedReader(...)) {returnbufferReader0.readLine();}Java 9 中对这个功能进行了增强,可以引用 try 代码块之外的变量来自动关闭:BufferedReader bufferReader0 = newBufferedReader(...);BufferedReader bufferReader1 = newBufferedReader(...);try(bufferReader0; bufferReader1) {System.out.println(br1.readLine() + br2.readLine());}Java 10(2018年3月)局部变量的自动类型推断(var)JAVA 10 带来了一个很有意思的语法 -var,它可以自动推断局部变量的类型,以后再也不用写类型了,也不用靠 lombok 的var注解增强了varmessage = "Hello, Java 10";不过这个只是语法糖,编译后变量还是有类型的,使用时还是考虑下可维护性的问题,不然写多了可就成 JavaScript 风格了Java 11(2018年9月)Lambda 中的自动类型推断(var)JAVA 11 中对 Lambda 语法也支持了var这个自动类型推断的变量,通过 var 变量还可以增加额外的注解:List languages = Arrays.asList("Java", "Groovy");String language = sampleList.stream().map((@Nonnull var x)->x.toUpperCase()).collect(Collectors.joining(", "));assertThat(language).isEqualTo("Java, Groovy");javac + java 命令一把梭以前编译一个 java 文件时,需要先 javac 编译为 class,然后再用 java 执行,现在可以一把梭了:$java HelloWorld.javaHello Java 11!Java Flight Recorder 登陆 OpenJDKJava Flight Recorder是个灰常好用的调试诊断工具,不过之前是在 Oracle JDK 中,也跟着 JDK 11 开源了,OpenJDK 这下也可以用这个功能,真香!Java12(2019年3月)更简洁的 switch 语法在之前的 JAVA 版本中,switch语法还是比较啰嗦的,如果多个值走一个逻辑需要写多个case:DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek();StringtypeOfDay = "";switch(dayOfWeek) {caseMONDAY:caseTUESDAY:caseWEDNESDAY:caseTHURSDAY:caseFRIDAY:typeOfDay = "Working Day";break;caseSATURDAY:caseSUNDAY:typeOfDay = "Day Off";}到了 JAVA 12,这个事情就变得很简单了,几行搞定,而且!还支持返回值:typeOfDay = switch(dayOfWeek) {caseMONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> "Working Day";caseSATURDAY, SUNDAY -> "Day Off";};instanceof + 类型强转一步到位之前处理动态类型碰上要强转时,需要先instanceof判断一下,然后再强转为该类型处理:Objectobj = "Hello Java 12!";if(obj instanceofString) {Strings = (String) obj;int length = s.length();}现在instanceof支持直接类型转换了,不需要再来一次额外的强转:Objectobj = "Hello Java 12!";if(obj instanceofStringstr) {int length = str.length();}Java 13(2019年9月)switch 语法再增强JAVA 12 中虽然增强了swtich语法,但并不能在->之后写复杂的逻辑,JAVA 12 带来了swtich更完美的体验,就像lambda一样,可以写逻辑,然后再返回:typeOfDay = switch(dayOfWeek) {caseMONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> {// do sth...yield"Working Day";}caseSATURDAY, SUNDAY -> "Day Off";};文本块(Text Block)的支持你是否还在为大段带换行符的字符串报文所困扰,换行吧一堆换行符,不换行吧看着又难受:Stringjson = "{\"id\":\"1697301681936888\",\"nickname\":\"空无\",\"homepage\":\"https://juejin.cn/user/1697301681936888\"}";JAVA 13 中帮你解决了这个恶心的问题,增加了文本块的支持,现在可以开心的换行拼字符串了,就像用模板一样:String json = """{"id":"1697301681936888","nickname":"空无","homepage":"https://juejin.cn/user/1697301681936888"}""";Java 14(2020年3月)新增的 record 类型,干掉复杂的 POJO 类一般我们创建一个 POJO 类,需要定义属性列表,构造函数,getter/setter,比较麻烦。JAVA 14 为我们带来了一个便捷的创建类的方式 -recordpublicrecord UserDTO(String id,String nickname,String homepage) { };publicstaticvoidmain(String[] args ){UserDTO user = newUserDTO("1697301681936888","空无","https://juejin.cn/user/1697301681936888");System.out.println(user.id);System.out.println(user.nickname);System.out.println(user.id);}IDEA 也早已支持了这个功能,创建类的时候直接就可以选:
不过这个只是一个语法糖,编译后还是一个 Class,和普通的 Class 区别不大更直观的 NullPointerException 提示NullPointerException算是 JAVA 里最常见的一个异常了,但这玩意提示实在不友好,遇到一些长一点的链式表达式时,没办法分辨到底是哪个对象为空。比如下面这个例子中,到底是innerMap为空呢,还是effected为空呢?Map wrapMap = newHashMap();wrapMap.put("innerMap",newHashMap());boolean effected = wrapMap.get("innerMap").get("effected");// StackTrace:Exception inthread "main"java.lang.NullPointerExceptionat org.example.App.main(App.java:50)JAVA 14 也 get 到了 JAVAER 们的痛点,优化了 NullPointerException 的提示,让你不在困惑,一眼就能定位到底“空”在哪!Exceptioninthread"main" java.lang.NullPointerException: Cannotinvoke"java.lang.Boolean.booleanValue()" becausethereturnvalueof"java.util.Map.get(Object)" isnullatorg.example.App.main(App.java:50)现在的 StackTrace 就很直观了,直接告诉你effected变量为空,再也不用困惑!安全的堆外内存读写接口,别再玩 Unsafe 的骚操作了在之前的版本中,JAVA 如果想操作堆外内存(DirectBuffer),还得 Unsafe 各种 copy/get/offset。现在直接增加了一套安全的堆外内存访问接口,可以轻松的访问堆外内存,再也不用搞 Unsafe 的骚操作了。// 分配 200B 堆外内存MemorySegment memorySegment = MemorySegment.allocateNative(200);// 用 ByteBuffer 分配,然后包装为 MemorySegmentMemorySegment memorySegment = MemorySegment.ofByteBuffer(ByteBuffer.allocateDirect(200));// MMAP 当然也可以MemorySegment memorySegment = MemorySegment.mapFromPath(Path.of("/tmp/memory.txt"), 200, FileChannel.MapMode.READ_WRITE);// 获取堆外内存地址MemoryAddress address = MemorySegment.allocateNative(100).baseAddress();// 组合拳,堆外分配,堆外赋值longvalue= 10;MemoryAddress memoryAddress = MemorySegment.allocateNative(8).baseAddress();// 获取句柄VarHandle varHandle = MemoryHandles.varHandle(long.class, ByteOrder.nativeOrder());varHandle.set(memoryAddress, value);// 释放就这么简单,想想 DirectByteBuffer 的释放……多奇怪memorySegment.close();新增的 jpackage 打包工具,直接打包二进制程序,再也不用装 JRE 了之前如果想构建一个可执行的程序,还需要借助三方工具,将 JRE 一起打包,或者让客户电脑也装一个 JRE 才可以运行我们的 JAVA 程序。现在 JAVA 直接内置了jpackage打包工具,帮助你一键打包二进制程序包,终于不用乱折腾了Java 15(2020年9月)ZGC 和 Shenandoah 两款垃圾回收器正式登陆在 JAVA 15中,ZGC 和 Shenandoah 再也不是实验功能,正式登陆了(不过 G1 仍然是默认的)。如果你升级到 JAVA 15 以后的版本,就赶快试试吧,性能更强,延迟更低封闭(Sealed )类JAVA 的继承目前只能选择允许继承和不允许继承(final 修饰),现在新增了一个封闭(Sealed )类的特性,可以指定某些类才可以继承:publicsealed interfaceServicepermitsCar, Truck{intgetMaxServiceIntervalInMonths();defaultintgetMaxDistanceBetweenServicesInKilometers(){return100000;}}Java 16(2021年3月)JAVA 16 在用户可见的地方变化并不多,基本都是 14/15 的实验性内容,到了 16 正式发布,这里就不重复介绍了。总结以上介绍的各种新特性,有些特性在历史版本中还属于实验性功能,不过按照 JAVA 目前这个驴一样的更新频率,很可能下个版本就是稳定版了。早学早享受,晚学被卷走……看看时间,300 秒到了吗?作者 | 空无来源 |juejin.cn/post/6964543834747322405
![](https://static.kouhao8.com/upload/cunchu/cunchu7/2021-08-31/202108310949104145.png)
推荐阅读:
世界的真实格局分析,地球人类社会底层运行原理
不是你需要中台,而是一名合格的架构师(附各大厂中台建设ppt)
企业IT技术架构规划方案
论数字化转型——转什么,如何转?
华为干部与人才发展手册(附PPT)
企业10大管理流程图,数字化转型从业者必备!
【中台实践】华为大数据中台架构分享.pdf
华为的数字化转型方法论
华为如何实施数字化转型(附PPT)
超详细280页Docker实战文档!开放下载
华为大数据解决方案(PPT)
相邻资料
阅读 下载数 0
最新课程
发声技巧 胖雪人的声音魔法课
2024-06-30浏览 99下载 18
说话技能 超硬核沟通课:关于说话的一切
2024-06-30浏览 270下载 23
谷晟阳 谷晟阳道家秘传面相基础+面相实战
2024-06-30浏览 60下载 34
谷晟阳 谷晟阳道家秘传九星催财法进阶课程
2024-06-30浏览 96下载 51
杜云学 《择日求吉实战班》8集
2024-06-30浏览 281下载 48
曲伟杰 曲伟杰催眠师初级、中级、高级
2024-06-30浏览 233下载 23
叶旭东《本地生活-商家实操指南》搞定业绩增长
2024-06-30浏览 200下载 50
《抖店无货源玩法》教你玩转抖店月入1W+
2024-06-30浏览 124下载 26
《解说类文案》教你写出好的爆款文案 上热门
2024-06-30浏览 185下载 49
《AI作图全能实战班》0基础开始 ai创意/ai摄影/ai置景/ai后期
2024-06-30浏览 191下载 38