内容简介:沉默王二
Java 14 已经发布有一周时间了,我准备来开个箱,和小伙伴们一起来看看新特性里面都有哪些好玩的。我们 程序员 应该抱着尝鲜、猎奇的心态,否则就容易固步自封,技术停滞不前。先来看看 Java 14 都有哪些新特性吧!
红色线划出来的是我比较感兴趣的,其余的对我没什么太大的吸引力,就暂且略过。
01、下载 JDK 14
要想开箱,得先下载 JDK 14,不然拿什么开箱呢,对吧?有 2 处地方可供下载,Oracle 上可以下载商用版, jdk.java.net 上可以下载开源版。我们就选择后者吧。
我目前用的是 Windows 操作系统,所以就选择 Windows 版的 zip 包进行下载,完成后记得解压。
02、升级 IntelliJ IDEA
需要把 IDEA 升级到抢先体验版 2020.1 EAP,否则无法支持 Java 14 的新特性。
社区版的下载地址如下所示:
https://www.jetbrains.com/idea/nextversion/
安装的时候可以把之前的版本卸载,也可以选择保留。完成后,我们来新建一个 Java 14 的项目。
01、instanceof
按照新特性的顺序,我们就先从 instanceof 说起吧。旧式的 instanceof 的用法如下所示:
public class OldInstanceOf { public static void main(String[] args) { Object str = "Java 14,真香"; if (str instanceof String) { String s = (String)str; System.out.println(s.length()); } } }
需要先使用 instanceof 在 if 条件中判断 str 的类型是否为 String(第一步),再在 if 语句中将 str 强转为字符串类型(第二步),并且要重新声明一个变量用于强转后的赋值(第三步)。
三个步骤也不算多,但总觉得应该还有更好的语法,这不,Java 14 就想到了这一层。
public class NewInstanceOf { public static void main(String[] args) { Object str = "Java 14,真香"; if (str instanceof String s) { System.out.println(s.length()); } } }
可以直接在 if 条件判断类型的时候添加一个变量,就不需要再强转和声明新的变量了。是不是特别简洁?但模式匹配的 instanceof 在 Java 14 中是预览版的,默认是不启用的,所以这段代码会有一个奇怪的编译错误(Java 14 中不支持模式匹配的 instanceof)。
那怎么解决这个问题呢?需要在项目配置中手动设置一下语言的版本。
设置完成后,编译错误就随风飘走了。程序输出的结果如下所示:
不错不错,真香。想知道 Java 编译器在背后帮我们做了什么吗?看一下反编译后的字节码就明白了。
public class NewInstanceOf { public NewInstanceOf() { } public static void main(String[] args) { Object str = "Java 14,真香"; String s; if (str instanceof String && (s = (String)str) == (String)str) { System.out.println(s.length()); } } }
在 if 条件判断前,先声明了变量 s,然后在 if 条件中进行了强转 s = (String)str)
,并且判断了 s 和 str 是否相等。确实是一个解放开放者生产力的好特性,强烈希望这个特性在下个版本中转正。
02、Records
在之前的一篇文章中,我谈到了类的不可变性,它是这样定义的:
public final class Writer { private final String name; private final int age; public Writer(String name, int age) { this.name = name; this.age = age; } public int getAge() { return age; } public String getName() { return name; } }
那么,对于 Records 来说,一条 Record 就代表一个不变的状态。尽管它会提供诸如 equals()
、 hashCode()
、 toString()
、构造方法,以及字段的 getter,但它无意替代可变对象的类(没有 setter),以及 Lombok 提供的功能。
来用 Records 替代一下上面这个 Writer 类:
public record Writer(String name, int age) { }
你看,一行代码就搞定。关键是比之前的代码功能更丰富,来看一下反编译后的字节码:
public final class Writer extends java.lang.Record { private final java.lang.String name; private final int age; public Writer(java.lang.String name, int age) { /* compiled code */ } public java.lang.String toString() { /* compiled code */ } public final int hashCode() { /* compiled code */ } public final boolean equals(java.lang.Object o) { /* compiled code */ } public java.lang.String name() { /* compiled code */ } public int age() { /* compiled code */ } }
类是 final 的,字段是 private final 的,构造方法有两个参数, toString()
、 hashCode()
、 equals()
方法也有了,getter 方法也有了,只不过没有 get 前缀。但是没有 setter 方法,也就是说 Records 确实针对的是不可变对象——鉴定完毕。那怎么使用 Records 呢?
public class WriterDemo { public static void main(String[] args) { Writer writer = new Writer("沉默王二",18); System.out.println("toString:" + writer); System.out.println("hashCode:" + writer.hashCode()); System.out.println("name:" + writer.name()); System.out.println("age:" + writer.age()); Writer writer1 = new Writer("沉默王二", 18); System.out.println("equals:" + (writer.equals(writer1))); } }
程序输出的结果如下所示:
toString:Writer[name=沉默王二, age=18] hashCode:1130697218 name:沉默王二 age:18 equals:true
不错不错,真香,以后定义不可变类时就简单了,强烈希望这个特性在下个版本中转正。
03、switch 表达式
关于 switch 表达式,我在之前的一篇文章中已经详细说明了,点击传送门可以跳转过去看看。两周时间过去了,switch 表达式终于“媳妇熬成婆”,转正了,恭喜恭喜。
记得这篇文章发表到掘金的时候,被喷子各种无脑 diss,说:“还以为你有什么技巧,没想到用的是 Java 13,可我们还停留在 Java 8 啊!”这显然是一种固步自封的心态,非常不可取,程序员不应该这样。一个最简单的道理就是,Java 6 当年也很经典,不是被 Java 8 取代了吗?随着时间的推移,Java 8 早晚会被更划时代的新版本取代——总要进步嘛。
关于 switch 表达式,这里就简单地搬个例子给你瞧瞧:
public class SwitchDemo { enum PlayerTypes { TENNIS, FOOTBALL, BASKETBALL, PINGPANG, UNKNOWN } public static void main(String[] args) { System.out.println(createPlayer(PlayerTypes.BASKETBALL)); } private static String createPlayer(PlayerTypes playerType) { return switch (playerType) { case TENNIS -> "网球运动员费德勒"; case FOOTBALL -> "足球运动员C罗"; case BASKETBALL -> "篮球运动员詹姆斯"; case PINGPANG -> "乒乓球运动员马龙"; case UNKNOWN -> throw new IllegalArgumentException("未知"); }; } }
除了可以使用 ->
的新式语法,还可以作为 return 结果,真香。
04、Text Blocks
在文本块(Text Blocks)出现之前,如果我们需要拼接多行的字符串,就需要很多英文双引号和加号,看起来就好像老太婆的裹脚布,非常不雅。如果恰好要拼接一些 HTML 格式的文本(原生 SQL 也是如此)的话,还要通过空格进行排版,通过换行转义符 \n
进行换行,这些繁琐的工作对于一名开发人员来说,简直就是灾难。
public class OldTextBlock { public static void main(String[] args) { String html = "<html>\n" + " <body>\n" + " <p>Hello, world</p>\n" + " </body>\n" + "</html>\n"; System.out.println(html); } }
Java 14 就完全不同了:
public class NewTextBlock { public static void main(String[] args) { String html = """ <html> <body> <p>Hello, world</p> </body> </html> """; System.out.println(html); } }
多余的英文双引号、加号、换行转义符,统统不见了。仅仅是通过前后三个英文双引号就实现了。我只能说,香,它真的香!
05、鸣谢
好了,我亲爱的读者朋友,以上就是本文的全部内容了,能看到这里的就是最优秀的程序员。 原创不易,莫要白票 ,请你为本文点个在看吧 ,这将是我写作更多优质文章的最强动力。
PS:实话实说吧,技术文一般比程序人生的文章差一千多的阅读量,意味着整体的阅读量会被拉低很多。但我必须得面对一个事实,技术文面向的群体是有限度的,毕竟读者不一定都搞 Java,但如你所见,我会尽量把文章写得更有趣些,更通俗些。你觉得受益了,就无情地转发吧,因为只有关注的读者越多,即便是打开率低一些,也是可以接受的,对吧?
沉默王二
一枚有趣的程序员
微信扫描二维码,关注我的公众号
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Elasticsearch 开箱指南
- Elasticsearch 开箱指南
- Java 14 开箱,它真香香香香
- 开箱即用的 WebRTC 开发环境
- 【开箱即食】命令行替你写表单
- 把 GitHub 放入口袋,“开箱” 官方客户端
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Numerical Methods and Methods of Approximation in Science and En
Karan Surana / CRC Press / 2018-10-31
ABOUT THIS BOOK Numerical Methods and Methods of Approximation in Science and Engineering prepares students and other readers for advanced studies involving applied numerical and computational anal......一起来看看 《Numerical Methods and Methods of Approximation in Science and En》 这本书的介绍吧!