跟上 Java 频繁公布的性能并不容易。如果您错过了密封类、文本块、记录、新的字符串办法或 Optional 类,让咱们修复它。
这对于放弃 Java 的新鲜度和相关性十分好,但它很容易在引入性能时错过它们。本文汇总了几个有用的新性能并对其进行了概述。
可选类
空指针异样是所有谬误中最经典的谬误之一。尽管它可能很相熟,但要提防这是一个十分简短的问题。至多在 Java 8 引入(以及 Java 10 改良)Optional该类之前是这样。
实质上,Optional该类容许您包装一个变量,而后应用包装器的办法更简洁地解决空值。清单 1 有一个花园类型空指针谬误的示例,其中类援用 ,foo为空,并且foo.getName()在其上拜访了办法 , 。
清单 1. 没有 Optional 的空指针
public class MyClass {
public static void main(String args[]) { InnerClass foo = null; System.out.println("foo = " + foo.getName());}
}
class InnerClass {
String name = "";
public String getName(){
return this.name;
}
}
Optional依据您的须要,提供了多种解决此类情况的办法。它提供了isPresent()一种可用于进行 if 查看的办法。然而,这最终变得相当简短。但Optional也有性能解决的办法。例如,清单 2 展现了如何应用ifPresent()(留神与 的一个字母不同isPresent())仅在存在值的状况下运行输入代码。
清单 2. 仅当值存在时才运行代码
import java.util.Optional;
public class MyClass {
public static void main(String args[]) { InnerClass foo = null; //new InnerClass("Test"); Optional fooWrapper = Optional.ofNullable(foo); fooWrapper.ifPresent(x -> System.out.println("foo = " + x.getName())); //System.out.println("foo = " + fooWrapper.orElseThrow());}
}
class InnerClass {
String name = "";
public InnerClass(String name){
this.name = name;
}
public String getName(){
return this.name;
}
}
提醒:应用 时Optional,如果您应用该orElse()办法通过办法调用提供默认值,请思考应用orElseGet()来提供函数援用,以取得在值非空时不运行调用的性能劣势。
Record 类(预览性能)
构建 Java 应用程序的一个常见需要是所谓的不可变 DTO(数据传输对象)。DTO 用于对来自数据库、文件系统和其余数据存储的数据进行建模。传统上,DTO 是通过创立一个类来创立的,该类的成员是通过构造函数设置的,没有 getter 来拜访它们。Java 14 引入并改良了 Java 15,record为此目标提供了简写的新关键字。
record清单 3 阐明了在引入类型之前的典型 DTO 定义和用法。
清单 3. 一个简略的不可变 DTO
public class MyClass {
public static void main(String args[]) { Pet myPet = new Pet("Sheba", 10); System.out.println(String.format("My pet %s is aged %s", myPet.getName(), myPet.getAge()));}
}
class Pet {
String name;Integer age;public Pet(String name, Integer age){ this.name = name; this.age = age;}public String getName(){ return this.name;}public Integer getAge(){ return this.age;}
}
record咱们能够应用清单 4 中所示的关键字打消大部分样板文件。
清单 4. 应用记录关键字
public class MyClass {
public static void main(String args[]) { Pet myPet = new Pet("Sheba", 10); System.out.println(String.format("My pet %s is aged %s", myPet.getName(), myPet.getAge()));}
}
public record Pet(String name, Integer age) {}
请留神,应用数据对象的客户端代码不会扭转;它的行为就像一个传统定义的对象。record关键字足够聪慧,能够通过简略的定义脚印推断存在哪些字段。
该类型还定义了、 和的record默认实现equals(),同时还容许开发人员笼罩这些实现。您还能够提供自定义构造函数。hashCode()toString()
请留神,不能对记录进行子分类。
新的字符串办法
在 Java 10 和 Java 12 中,String增加了几个有用的新办法。除了字符串操作方法之外,还引入了两种简化文本文件拜访的新办法。
StringJava 10 中的新办法:
isBlank():如果字符串为空或字符串仅蕴含空格(这包含制表符),则返回 true。NoteisBlank()与 不同isEmpty(),后者仅在长度为 0 时返回 true。
lines():将字符串拆分为字符串流,每个字符串蕴含一行。线条由/r或/n或定义/r/n。例如,思考上面的清单 5。
strip(), stripLeading(), stripTrailing(): 别离从结尾和结尾、仅结尾和仅结尾删除空格。
repeat(int times):返回一个字符串,该字符串采纳原始字符串并反复指定的次数。
readString():容许从文件门路间接读取到字符串,如清单 6 所示。
writeString(Path path): 将字符串间接写入指定门路的文件中。
StringJava 12 中的新办法:
indent(int level):将字符串缩进指定的数量。负值只会影响前导空格。
transform(Function f):将给定的 lambda 利用于字符串。
清单 5. String.lines() 示例
Path path = Path.of("myFile.txt");
String text = Files.readString(path);
System.out.println(text);
切换表达式
Java 12 引入了switch容许switch在语句中内联应用的表达式。换句话说,switch表达式返回一个值。Java 12 还提供了一种箭头语法,无需显式break地避免失败。Java 13 更进一步,引入了yield关键字来明确示意switchcase 返回的值。Java 14 采纳了新的switch表达式语法作为一个残缺的个性。
让咱们看一些例子。首先,清单 7 有一个(十分人为的)switch传统(Java 8)格局的语句示例。此代码应用变量 ( message) 来输入已知数字的名称。
清单 7. 老式 Java 开关
class Main {
public static void main(String args[]) {
int size = 3;String message = "";
switch (size){
case 1 :
message = "one";
case 3 :
message = "three";
break;
default :
message = "unknown";
break;
}
System.out.println("The number is " + message);
}
}
当初这段代码十分简短和挑剔。其实外面曾经有谬误了!认真寻找失落的break. 清单 8 通过应用switch表达式对其进行了简化。
清单 8. 新的 switch 表达式
class NewSwitch {
public static void main(String args[]) {
int size = 3;System.out.println("The number is " + switch (size) { case 1 -> "one"; case 3 -> "three"; default -> "unknown"; });
}
}
在清单 8 中,您能够看到switch表达式间接在System.out.println调用外部。这曾经是一个微小的可读性胜利,并且打消了多余的音讯变量。此外,箭头语法通过打消语句来缩小代码占用break。(yield不应用箭头语法时应用关键字。)
文本块
Java 13 通过引入文本块解决了长期以来在 Java 中解决简单文本字符串的懊恼。Java 14 改良了这种反对。
JSON、XML 和 SQL 之类的货色可能会让您因多个嵌套的本义层而发疯。正如标准所解释的:
在 Java 中,在字符串文字中嵌入 HTML、XML、SQL 或 JSON 的片段……通常须要在蕴含该片段的代码编译之前应用本义和连贯进行大量编辑。该片段通常难以浏览且难以保护。
看看清单 9,其中新的文本块语法用于创立 JSON 片段。
清单 9. 应用文本块的 JSON
class TextBlock {
public static void main(String args[]) {
String json = """ { "animal" : "Quokka", "link" : "https://en.wikipedia.org/wiki/Quokka" }""";System.out.println(json);
}
}
在清单 9 中,看不到转义字符。留神三重双引号语法。
密封类
Java 15(JEP260) 引入了密封类的概念。简而言之,newsealed关键字容许您定义哪些类能够子类化接口。在这种状况下,一个例子值一千字。请参见清单 10。
清单 10. 密封类示例
public abstract sealed class Pet
permits Cat, Dog, Quokka {...}
这里界面设计者应用sealed关键字来指定容许哪些类扩大Pet该类。
总的来说,很显著,Java 公布的新办法正在发挥作用。咱们看到许多新想法通过 JEP(JDK 加强提案)流程转化为理论可用的 Java 性能。这对 Java 开发人员来说是个好消息。这意味着咱们正在一个活生生的、一直倒退的语言和平台中工作。
须要学习更多Java材料 关注博主,私聊博主收费获取