From 3f95a795dcca65f1d4881c8746c2792a098a23d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=B6=9B?= Date: Fri, 21 May 2021 15:13:43 +0800 Subject: [PATCH] =?UTF-8?q?post:=E5=AE=8C=E6=88=90Java=2012=E6=96=B0?= =?UTF-8?q?=E7=89=B9=E6=80=A7=E6=96=87=E7=AB=A0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/_posts/nf-java12.md | 80 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 source/_posts/nf-java12.md diff --git a/source/_posts/nf-java12.md b/source/_posts/nf-java12.md new file mode 100644 index 0000000..b3002af --- /dev/null +++ b/source/_posts/nf-java12.md @@ -0,0 +1,80 @@ +--- +title: Java 12的新特性 +tags: + - JVM + - Java + - Java 12 + - 字符串 + - 集合转换 + - 数字格式化 +categories: + - - JVM + - Java +keywords: 'Java,Java 12,新特性,字符串,集合,收集器,数字,格式化' +date: 2021-05-21 15:03:12 +--- + +Java 12也是两个LTS版之间的小进化版本,这个版本带来的变化也主要集中在优化开发者体验上。 + +本系列的文章有: + +- {% post_link nf-java8 %} +- {% post_link nf-java9 %} +- {% post_link nf-java10 %} +- {% post_link nf-java11 %} +- {% post_link nf-java12 %} +- {% post_link nf-java13 %} +- {% post_link nf-java14 %} +- {% post_link nf-java15 %} +- {% post_link nf-java16 %} + +## 新字符串方法 + +`String`类新增了两个方法:`.indent()`和`.transform()`。 + +`.indent()`方法可以为字符串中的每一行增加或减少缩进。这个方法可以接受一个整型值作为参数,如果参数值为正值,那么所有行的缩进将增加指定数量的空格;如果参数值为负值,那么所有行的缩进将减少指定数量的空格。`.indent()`方法只影响每行前的空格,不会影响其他字符。 + +`.transform()`方法可以接受一个`Function`类型的参数,主要用于对指定的字符串进行变换。 + +## 文件差异比较 + +Java 12在`java.nio.file.Files`工具类中提供了一个名为`.mismatch()`的方法。这个方法接受两个`Path`类型的值作为参数,会返回这两个`Path`所指代的内容中出现的第一处不一致的字节位置。如果两个文件是一样的,那么这个方法将返回`-1`。 + +## Stream合并收集器 + +合并收集器主要是用来把一个Stream的两个Collector合并在一起,形成一个集合。这个合并收集器的名字很简单,就叫`.teeing()`。这个方法的签名如下。 + +```java +Collector teeing( + Collector downStream1, + Collector downStream2, + BiFunction merger +) +``` + +这里给出一个简单的使用示例。 + +```java +double mean = Stream.of(1, 2, 3, 4, 5) + .collect(Collectors.teeing( + Collectors.summingDouble(i -> i), + Collectors.counting(), + (sum, count) -> sum / count + )); +``` + +在这个示例中,第一个Collector将被用来对所有的数据进行加和,第二个则用来计算Stream中元素的数量,最后的合并方法则是将两个Collector得到的结果进行进一步处理得到平均值。 + +## 压缩数字格式 + +压缩数字格式的意思就是使用`2.9K`表示`2900`,或者使用`2.9 thousand`表示`2900`之类的数字格式。但是需要注意,不同的Locale输出的数字格式是不一样的。压缩数字格式是在`java.text.NumberFormat`类中提供的,可以使用静态方法`.getCompactNumberFormatInstance()`获取,之后的操作便如`NumberFormat`的其他实例一样了。 + +## 预览版功能 + +Java 12带来了一票预览版功能,但是这些功能默认是不能够使用的,如果要使用这些功能,需要在编译时使用选项`--enable-preview`来启用。由于这些功能还处于预览版,所以在项目中并不建议启用,本文也暂时不再对其展开描述。 + +这些预览版功能有: + +- `switch`现在可以使用新语法了,并且不再是一个语句,而是一个拥有值的表达式。 +- `instanceOf`操作符现在不仅可以断言类型,还可以在断言为真的时候直接声明一个完成了类型转换的变量。 +- 引入了一个实验性的GC:Shenandoah。 \ No newline at end of file