Java 12 – 新特性和增强

位置:首页>文章>详情   分类: 教程分享 > Java教程   阅读(703)   2023-03-28 11:29:14
Java 12(2019 年 3 月 19 日发布)是 JDK 可用的最新版本。让我们看看它为开发人员和架构师带来的新功能和改进。

1. Stream API 中的 Collectors.teeing()

发球收集器已公开为静态方法Collectors::teeing。在将结果与函数合并之前,此收集器将其输入转发给其他两个收集器。
teeing(Collector, Collector, BiFunction)接受两个收集器和一个函数来合并它们的结果。传递给结果收集器的每个元素都由两个下游收集器处理,然后使用指定的合并函数将它们的结果合并到最终结果中。
例如,在给定的员工列表中,如果我们想找出工资最高和最低工资的员工,我们可以使用 teeing 收集器在单个语句中完成。

​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. 字符串缩进()

indent 方法有助于更改字符串的缩进。我们可以传递正值或负值,具体取决于我们是要添加更多空格还是删除现有空格。
String result = "foo\nbar\nbar2".indent(4);
 
System.out.println(result);
 
//    foo
//    bar
//    bar2

请注意,如果尚未提供换行符,则indent()方法会自动添加换行符。这是意料之中的,也是新方法的一个特点。
每个空白字符都被视为单个字符。特别地,制表符"\t" (U+0009) 被认为是单个字符;它没有扩展。

2.2. String.transform()

transform()方法接受 aString并在 a 的帮助下将其转换为新的 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
Stringclass 还引入了两个额外的低级方法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);   //returns long value

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 个字符 - 以及七个新脚本,总共 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 。
地址:https://www.leftso.com/article/870.html

相关阅读

Java 12(2019 年 3 月 19 日发布)是 JDK 可用的最新版本
JAVA10 升级后的几个我们值得关注的新特性。尤其是第一个,赶紧看看JDK10的新特性吧。
JDK11 90+ 新特性新功能(第一部分)开发人员可见功能
JDK11 90+ 新特性新功能(第二部分:非开发人员功能)
JDK 11 String 新方法使用教程
截至 8 月 19 日,Java 17 已进入第二个也是最后一个候选版本
windows10如何安装JDK_windows10怎么配置jdk环境变量,windows XP/7/8/10系统配置java运行开发环境即配置jdk环境变量
jdk8新特性流的使用
在Linux系统中安装和配置Java的运行或者编译jdk环境。安装分两种类型,系统安装包例如centos系列的有rpm包或者通过yum安装;第二总就是Linux通用的方法,下载对应系统的jdk压...
了解JDK、JRE 和 JVM 之间的差异