Java 12(2019 年 3 月 19 日公布)是可用于 JDK 的最新版本。让咱们看看它为开发人员和架构师带来的新性能和改良。

1. Stream API 中的 Collectors.teeing()

teeing 收集器已公开为静态方法Collectors::teeing。该收集器将其输出转发给其余两个收集器,而后将它们的后果应用函数合并。

teeing(Collector, Collector, BiFunction)承受两个收集器和一个合并其后果的函数。传递给后果收集器的每个元素都由两个上游收集器解决,而后应用指定的合并函数将它们的后果合并到最终后果中。

例如,在给定的学生列表中,如果咱们想找出学生平均分/总分/最低分/最高分,咱们能够应用 teeing collector 在单个语句中实现。

package cn.dayangshuo.collectors;import java.util.Arrays;import java.util.Comparator;import java.util.List;import java.util.stream.Collectors;/** * @author DAYANG */public class TeeingTest {    public static void main(String[] args) {        List<Student> list = Arrays.asList(                new Student("张三", 96),                new Student("李四", 98),                new Student("大阳", 82));        //平均分 总分        String result = list.stream().collect(Collectors.teeing(                Collectors.averagingInt(Student::getScore),                Collectors.summingInt(Student::getScore),                (s1, s2) -> s1 + ":" + s2));        //最低分  最高分        String result2 = 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(result);        System.out.println(result2);    }    static class Student {        private String name;        private Integer score;        public Student(String name, Integer score) {            this.name = name;            this.score = score;        }        public String getName() {            return name;        }        public void setName(String name) {            this.name = name;        }        public Integer getScore() {            return score;        }        public void setScore(Integer score) {            this.score = score;        }        @Override        public String toString() {            return "Student{" +                    "name='" + name + '\'' +                    ", score=" + score +                    '}';        }    }}

2. 字符串 API 变更

2.1 字符串缩进

indent 办法有助于更改字符串的缩进。咱们能够传递正值或负值,具体取决于咱们是要增加更多空格还是删除现有空格。

String result = "foo\nbar\nbar2".indent(4);System.out.println(result)//    foo//    bar//    bar2

2.2. transform()

字符串转换方法,看代码:

List<String> names = List.of(                  "   Alex",                  "brian"); List<String> transformedNames = new ArrayList<>(); for (String name : names) {    String transformedName = name.transform(String::strip)                      .transform(StringUtils::toCamelCase);    transformedNames.add(transformedName);}

2.3. 字符串常量

从 Java 12 开始,String类实现了两个额定的接口java.lang.constant.Constablejava.lang.constant.ConstantDesc

String类还引入了两个额定的低级办法describeConstable()resolveConstantDesc(MethodHandles.Lookup).

它们是低级 API,用于提供字节码解析和生成性能的库和工具,例如 Byte Buddy。

请留神,Constable类型是其值是能够在 Java 类文件的常量池中示意的常量,如JVMS 4.4中所述,并且其实例能够名义上将本人形容为ConstantDesc.

resolveConstantDesc()与此相似,describeConstable()不同之处在于此办法返回的是 C 的实例onstantDesc

3. Files.mismatch(path, path)

有时,咱们想确定两个文件是否具备雷同的内容。此 API 有助于比拟文件的内容。

mismatch()办法比拟两个文件门路并返回一个long值。long 示意两个文件内容中第一个不匹配字节的地位。'–1'如果文件“相等”,则返回值。

Path helloworld1 = tempDir.resolve("helloworld1.txt"); Path helloworld2 = tempDir.resolve("helloworld2.txt");long diff = Files.mismatch(helloworld1, helloworld2); 

4.紧凑数字格局

由用户界面或命令行工具出现的大量数字总是难以解析。应用数字的缩写模式更为常见。紧凑的数字示意更容易浏览并且在屏幕上须要更少的空间而不会失去原始含意。

例如3.6 M3,600,000更容易浏览。

Java 12 引入了一种名为NumberFormat.getCompactNumberInstance(Locale, NumberFormat.Style)的便捷办法,用于创立紧凑的数字示意。

NumberFormat formatter = NumberFormat.getCompactNumberInstance(Locale.US,``                 ``NumberFormat.Style.SHORT);` `String formattedString = formatter.format(25000L);  ``//25K

5. 反对 Unicode 11

在表情符号在社交媒体渠道交换中施展关键作用的时代,反对最新的 Unicode 标准比以往任何时候都更加重要。Java 12 放弃同步并反对 Unicode 11。

Unicode 11 减少了 684 个字符,总共 137,374 个字符 - 以及 7 个新脚本,总共 146 个脚本。

6.切换表达式(预览)

此更改扩大了switch 语句以便它能够用作语句或表达式。

不用为break每个 case 块定义一个语句,咱们能够简略地应用箭头语法。箭头语法在语义上看起来像一个 lambda,并将 case 标签与表达式离开。

应用新的 switch 表达式,咱们能够间接将 switch 语句调配给变量。

boolean isWeekend = switch (day) {  case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> false;   case SATURDAY, SUNDAY -> true;  default -> throw new IllegalStateException("Illegal day entry :: " + day);}; System.out.println(isWeekend);  //true or false - based on current day
要应用此预览性能,咱们必须在应用程序启动期间应用–enable-preview标记明确批示 JVM。