Java 12 之 新功能和增强功能

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

1. Stream API中的Collectors.teeing()

Teeing Collectors已作为静态方法Collectors :: teeing开放了, 在将其结果与功能合并之前,此Collectors将其输入转发给其他两个Collectors。

teeing(Collector, Collector, BiFunction)接受两个Collectors和一个函数来合并其结果。传递给结果Collectors的每个元素都由两个下游Collectors处理,然后使用指定的合并功能将其结果合并为最终结果。

例如,在给定的雇员列表中,如果我们想找出最高薪水和最低薪水的雇员,则可以使用发球台Collectors在单个语句中完成。

Collector.teeing()示例
SalaryRange salaryRange = Stream
            .of(56700, 67600, 45200, 120000, 77600, 85000)
            .collect(teeing(
                    minBy(Integer::compareTo),
                    maxBy(Integer::compareTo),
                    SalaryRange::fromOptional));

阅读更多:Collectors.teeing()

2.字符串API的更改

2.1。String.indent()

缩进方法有助于更改字符串的缩进。我们可以传递一个正值或一个负值,具体取决于我们是要添加更多的空白还是要删除现有的空白。

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

请注意,如果尚未提供indent()方法,则会自动添加换行符。这是可以预期的,并且是新方法的功能。

每个空格字符都被视为一个字符。特别是,制表符"\t" (U+0009)被视为单个字符;它不会扩展。

2.2。String.transform()

transform()方法采用a String并将其转换为新的String Function

在给定的示例中,我们有一个名称列表。我们正在使用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开始,Stringclass实现了两个附加接口java.lang.constant.Constablejava.lang.constant.ConstantDesc

String该类还引入了两个附加的低层方法describeConstable()resolveConstantDesc(MethodHandles.Lookup)

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

请注意,一种Constable类型是一种类型,其值是可以在JVMS 4.4中描述的Java类文件的常量池中表示的常量,并且其实例可以名义上将自己描述为ConstantDesc

resolveConstantDesc()类似于,describeConstable()不同之处在于此方法onstantDesc改为返回C的实例。

3. Files.mismatch(路径,路径)

有时,我们想确定两个文件是否具有相同的内容。该API有助于比较文件的内容。

mismatch()方法比较两个文件路径并返回一个long值。long表示两个文件内容中第一个不匹配字节位置。返回值将是'–1'文件是否“相等”。

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

4.紧凑的数字格式

用户界面或命令行工具提供的大量数字始终很难解析。使用数字的缩写形式更为常见。紧凑的数字表示形式更易于阅读,并且在屏幕上占用的空间更少,而不会失去其原始含义。

EG 的3.6M 非常容易得多比阅读3600000

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

在表情符号在社交媒体渠道交 Stream 中发挥关键作用的时代,支持最新的Unicode规范比以往任何时候都更为重要。Java 12保持同步并支持Unicode 11。

Unicode 11增加了684个字符,总计137,374个字符–以及七个新脚本,总共146个脚本。

6.切换表达式(预览)

此更改扩展了switch语句,因此可以将其用作语句或表达式。

不必为break每个case块定义一个语句,我们只需使用arrow语法即可。箭头语法在语义上看起来像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 。

请把有关Java 12中这些新API更改的问题交给我。

学习愉快!

saigon has written 1440 articles

Leave a Reply