Java 12 – 新特性和增强特性
原文: https://howtodoinjava.com/java12/new-features-enhancements/
Java 12(于 2019 年 3 月 19 日发布)是 JDK 的最新版本。 让我们看看它为开发人员和建筑师带来的新特性和改进。
1. 流 API 中的Collectors.teeing()
teeing
收集器已作为静态方法公开Collectors::teeing
。 在将其结果与函数合并之前,此收集器将其输入转发给其他两个收集器。
teeing(Collector, Collector, BiFunction)
接受两个收集器和一个函数来合并其结果。 传递给结果收集器的每个元素都由两个下游收集器处理,然后使用指定的合并函数将其结果合并为最终结果。
例如,在给定的雇员列表中,如果我们想找出最高薪水和最低薪水的雇员,则可以使用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()
方法采用String
并借助Function
将其转换为新的String
。
在给定的示例中,我们有一个名称列表。 我们正在使用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.Constable
和java.lang.constant.ConstantDesc
。
String
类还引入了两个附加的低级方法describeConstable()
和resolveConstantDesc(MethodHandles.Lookup)
。
它们是低级 API,适用于提供字节码解析和生成特性的库和工具,例如 ByteBuddy。
请注意,Constable
类型是一种值,该值是可以在 Java 类文件的常量池中表示的常量,如 JVMS 4.4 中所述,并且其实例可以名义上将自己描述为ConstantDesc
。
resolveConstantDesc()
与describeConstable()
相似,不同之处在于此方法改为返回ConstantDesc
的实例。
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 M 比 3,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
表达式(预览)
此更改扩展了 switch
语句 ,以便可以将其用作语句或表达式。
不必为每个case
块定义break
语句,我们只需使用箭头语法即可。 箭头语法在语义上看起来像 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 更改的问题。
学习愉快!