当前位置: 首页 > 后端技术 > Java

Java12新功能和代码示例

时间:2023-04-02 00:20:30 Java

Java12(2019年3月19日发布)是可用于JDK的最新版本。让我们来看看它为开发者和架构师带来的新特性和改进。1.StreamAPI中的Collectors.teeing()teeing收集器作为静态方法Collectors::teeing公开。该收集器将其输入转发给其他两个收集器,然后使用函数组合其结果。teeing(Collector,Collector,BiFunction)接受两个收集器和一个组合它们结果的函数。传递给结果收集器的每个元素都由两个下游收集器处理,然后使用指定的合并函数将其结果合并为最终结果。例如,给定一个学生列表,如果我们想找出学生的平均分/总分/最低分/最高分,我们可以使用发球收集器在一条语句中完成。packagecn.dayangshuo.collectors;importjava.util.Arrays;importjava.util.Comparator;importjava.util.List;importjava.util.stream.Collectors;/***@authorDAYANG*/publicclassTeeingTest{publicstaticvoidmain(String[]args){Listlist=Arrays.asList(newStudent("张三",96),newStudent("李四",98),newStudent("大阳",82));//平均分总分Stringresult=list.stream().collect(Collectors.teeing(Collectors.averagingInt(Student::getScore),Collectors.summingInt(Student::getScore),(s1,s2)->s1+":"+s2));//最低分最高分Stringresult2=list.stream().collect(Collectors.teeing(Collectors.minBy(Comparator.comparing(Student::getScore)),Collectors.maxBy(Comparator.comparing(Student::getScore)),(s1,s2)->s1.orElseThrow()+":"+s2.orElseThrow()));System.out.println(结果);System.out.println(result2);}staticclassStudent{私有字符串名称;私人整数分数;publicStudent(Stringname,Integerscore){this.name=name;this.score=得分;}publicStringgetName(){返回名称;}publicvoidsetName(Stringname){this.name=name;}publicIntegergetScore(){返回分数;}publicvoidsetScore(Integerscore){this.score=score;}@OverridepublicStringtoString(){return"Student{"+"name='"+name+'\''+",score="+score+'}';}}}2.StringAPI改变2.1Stringindentation缩进方法有助于改变字符串的缩进我们可以传递正值或负值,这取决于我们是否要添加更多空格或删除现有空格。Stringresult="foo\nbar\nbar2".indent(4);System.out.println(result)//foo//bar//bar22.2.transform()字符串转换方法,见代码:Listnames=List.of("Alex","brian");ListtransformedNames=newArrayList<>();for(Stringname:names){StringtransformedName=name.transform(String::strip).转换(StringUtils::toCamelCase);transformedNames.add(transformedName);}2.3。字符串常量从Java12开始,String类实现了两个额外的接口java.lang.constant.Constable和java.lang.constant.ConstantDesc。String类还引入了两个额外的低级方法describeConstable()和resolveConstantDesc(MethodHandles.Lookup)。这些是用于提供字节码解析和生成功能的库和工具的低级API,例如ByteBuddy。请注意,Constable类型是一个常量,其值可在Java类文件的常量池中表示,如JVMS4.4中所述,其实例名义上可以将自己描述为ConstantDesc.resolveConstantDesc()类似地,describeConstable()的区别在于该方法返回C的实例constantDesc。3.Files.mismatch(path,path)有时,我们想判断两个文件的内容是否相同。此API有助于比较文件的内容。mismatch()方法比较两个文件路径并返回一个long值。long表示第一个不匹配字节在两个文件内容中的位置。'–1'如果文件“相等”则返回值。路径helloworld1=tempDir.resolve("helloworld1.txt");路径helloworld2=tempDir.resolve("helloworld2.txt");longdiff=Files.mismatch(helloworld1,helloworld2);4.用户界面或命令的紧凑数字格式行工具呈现的大数字总是难以解析。使用缩写形式的数字更为常见。紧凑的数字表示形式更易于阅读,并且在屏幕上占用的空间更少,而且不会失去原来的含义。例如3.6M比3,600,000更容易阅读。Java12引入了一种名为NumberFormat.getCompactNumberInstance(Locale,NumberFormat.Style)的便捷方法,用于创建紧凑的数字表示形式。NumberFormatformatter=NumberFormat.getCompactNumberInstance(Locale.US,````NumberFormat.Style.SHORT);``StringformattedString=formatter.format(25000L);``//25K5。在社交媒体渠道的表情符号中支持Unicode11在交流起着至关重要作用的时代,支持最新的Unicode规范比以往任何时候都更加重要。Java12保持同步并支持Unicode11。Unicode11添加了684个字符,总共137,374个字符-以及七个新脚本,总共146个脚本。6.switch表达式(预览)此更改扩展了switch语句,使其可以用作语句或表达式。我们可以简单地使用箭头语法,而不是为每个case块定义一个break语句。箭头语法在语义上看起来像lambda,并将case标签与表达式分开。使用新的switch表达式,我们可以直接将switch语句分配给变量。booleanisWeekend=switch(day){caseMONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY->false;}星期六、星期日->真;default->thrownewIllegalStateException("非法日期输入::"+day);};System.out.println(isWeekend);//true或false-基于当天要使用此预览功能,我们必须在应用程序启动期间使用--enable-preview标志明确指示JVM。