当前位置: 首页 > 科技观察

不要错过的六个优秀Java新功能

时间:2023-03-14 19:34:09 科技观察

您不应错过的六项出色的Java新功能这个大胆的新计划导致Java开发人员每六个月发布一次新功能。这有利于保持Java的新鲜感和相关性,但也使开发人员很容易错过引入的功能。本文汇集并概述了几个有用的新功能。1.可选类(Optionalclass)空指针异常是所有错误中最经典的一种。虽然开发人员可能熟悉这个问题,但这是一个需要防范的漫长过程。至少在Java8(和Java10的改进)引入可选类之前是这样。本质上,可选类允许包装一个变量,然后使用包装器的方法更简洁地处理空值。清单1有一个多个空指针错误的示例,其中可选类引用foo为空,并且在其上访问了方法foo.getName()。清单1.没有可选类的空指针publicStringgetName(){returnthis.name;}}可选类提供了几种方法来处理这种情况,具体取决于开发人员的需要。它运行一个isPresent()方法,开发人员可以使用该方法进行if检查。然而,这个过程可能相当漫长。但是可选类也有函数处理方法。例如,清单2显示了如何使用ifPresent()——注意与isPresent()的一个字母的区别,后者仅在值存在时运行输出代码。清单2.仅当值存在时才运行代码importjava.util.Optional;publicclassMyClass{publicstaticvoidmain(Stringargs[]){InnerClassfoo=null;//newInnerClass("Test");OptionalfooWrapper=Optional.ofNullable(foo);fooWrapper.ifPresent(x->System.out.println("foo="+x.getName()));//System.out.println("foo="+fooWrapper.orElseThrow());}}classInnerClass{Stringname="";publicInnerClass(Stringname){this.name=name;}publicStringgetName(){returnthis.name;}}提示:使用可选类时,如果使用orElse()方法通过方法调用提供默认值,需要考虑如果该值不为null,则使用orElseGet()为不运行调用的性能优势提供函数引用。2.记录类(预览功能)构建Java应用程序的一个常见要求是所谓的不可变DTO(数据传输对象)。DTO用于对来自数据库、文件系统和其他数据存储的数据建模。传统上,DTO是通过创建一个类来创建的,该类的成员是通过构造函数设置的,并且没有访问它们的getter方法。Java14在Java15的基础上引入和改进,新的record关键字为此目的提供了一种简写。清单3说明了在引入记录类型之前典型的DTO定义和用法。清单3.一个简单的不可变DTO,myPet.getAge()));}}classPet{Stringname;Integerage;publicPet(Stringname,Integerage){this.name=name;this.age=age;}publicStringgetName(){returnthis.name;}publicIntegergetAge(){returnthis.age;}}您可以使用record关键字消除大部分样板文件,如清单4所示。清单4.使用记录键publicclassMyClass{publicstaticvoidmain(Stringargs[]){PetmyPet=newPet("Sheba",10);System.out.println(String.format("Mypet%sisaged%s",myPet.getName(),myPet.getAge()));}}publicrecordPet(Stringname,Integerage){}注意客户端代码使用数据对象没有改变;它的行为就像一个传统定义的对象。记录键足够智能,可以通过简单地定义足迹来推断存在哪些字段。记录类还定义了equals()、hashCode()和toString()的默认实现,同时还允许开发人员覆盖这些实现。开发人员还可以提供自定义构造函数。请注意,记录不能被子类化。3.新的字符串方法在Java10和Java12中,增加了几个有用的新字符串方法。除了字符串操作方法外,还引入了两种新方法,以便更轻松地访问文本文件。Java10中的新字符串方法:isBlank():如果字符串为空或字符串仅包含空格(包括制表符),则返回true。请注意,isBlank()与isEmpty()不同,后者仅在长度为0时返回true。lines():将字符串拆分为字符串流,每个字符串包含一行。每行由/r或/n或/r/n定义。例如,参见清单5。strip()、stripLeading()、stripTrailing():分别从开头和结尾删除空格,仅删除开头和结尾。repeat(inttimes):返回一个字符串,该字符串采用原始字符串并将其重复指定的次数。readString():允许直接从文件路径读取字符串,如清单6所示。writeString(Pathpath):将字符串直接写入指定路径的文件。Java12中的新字符串方法:indent(intlevel):按指定量缩进字符串。负值只影响前导空格。transform(Functionf):将给定的lambda应用于字符串。清单5.String.lines()示例.lines();lines.forEach(System.out::println);}}/*outputs:testtest2test3*/Listing6.String.readString(Pathpath)示例Pathpath=Path.of("myFile.txt");Stringtext=Files.readString(路径);System.out.println(文本);4.Switch表达式Java12引入了Switch表达式,允许在语句中内联使用Switch。换句话说,Switch表达式返回一个值。Java12还提供了一种箭头语法,可以在没有显式中断的情况下防止失败。Java13进一步改进,引入了yield关键字来明确表示Switchcase返回的值。Java14采用了新的Switch表达式语法作为一项完整功能。让我们看一些例子。首先,清单7有一个传统格式(Java8)的Switch语句示例。此代码使用变量(消息)输出已知号码的名称。清单7.传统JavaSwitchclassMain{publicstaticvoidmain(Stringargs[]){intsize=3;Stringmessage="";switch(size){case1:message="one";case3:message="three";break;default:message="unknown";break;}System.out.println("Thenumberis"+message);}}现在这段代码非常冗长和挑剔。其实这里面已经有错误了,需要开发者仔细寻找缺失的内容。清单8通过使用新的Switch表达式进行了简化。清单8.新的Switch表达式classNewSwitch{publicstaticvoidmain(Stringargs[]){intsize=3;System.out.println("Thenumberis"+switch(size){case1->"one";case3->"three";default->"unknown";});}}在清单8中,您可以看到Switch表达式位于System.out.println调用中。这已经是一个很大的可读性胜利,并且消除了冗余的消息变量。此外,箭头语法通过消除break语句来减少代码占用空间。(不使用箭头语法时使用yield关键字。)5.文本块Java13通过引入文本块解决了Java中长期存在的处理复杂文本字符串的问题。Java14改进了这种支持。JSON、XML和SQL之类的东西可能会让开发人员不知所措,因为它们有多个嵌套的转义层。正如规范所解释的那样:“在Java中,在字符串文字中嵌入HTML、XML、SQL或JSON的片段……通常需要使用转义和连接进行大量编辑,然后才能编译包含该片段的代码。代码段通常难以阅读和维护。”在清单9中,新的文本块语法用于创建JSON片段。清单9.使用文本块的JSONclassTextBlock{publicstaticvoidmain(Stringargs[]){Stringjson="""{"animal":"Quokka","link":"https://en.wikipedia.org/wiki/Quokka"}""";System.out.println(json);}}在清单9中看不到转义字符。另外,请注意三重双引号语法。6.密封类Java15(JEP260)引入了密封类的概念。简而言之,新的sealed关键字允许开发人员定义哪些类可以子类化接口。在这种情况下,示例值一千字。参见清单10。清单10.密封类示例publicabstractsealedclassPetpermitsCat,Dog,Quokka{...}界面设计者在这里使用sealed关键字来指定允许哪些类扩展Pet类。总的来说,很明显Java发布特性的新方法正在发挥作用。通过JEP(JDK增强提案)过程,人们看到许多新想法被转化为实际可用的Java特性。这对Java开发人员来说是个好消息。这意味着他们正在使用一种动态的、不断发展的语言和平台。原标题:你不想错过的6个很棒的Java新特性,作者:MatthewTyson