# Java 12 – 新特性和增强特性

> 原文： [https://howtodoinjava.com/java12/new-features-enhancements/](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`收集器在单个语句中完成。

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

```

阅读更多：[`Collectors.teeing()`](https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/util/stream/Collectors.html#teeing(java.util.stream.Collector,java.util.stream.Collector,java.util.function.BiFunction))

## 2\. 字符串 API 的更改

#### 2.1 `String.indent()`

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

```java
String result = "foo\nbar\nbar2".indent(4);

System.out.println(result);

//    foo
//    bar
//    bar2

```

请注意，[`indent()`](https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/String.html#indent(int))方法会自动添加换行符（如果尚未提供）。 这是预料之中的，并且是新方法的特性。

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

#### 2.2 `String.transform()`

`transform()`方法采用[`String`](https://howtodoinjava.com/java-string/)并借助`Function`将其转换为新的`String`。

在给定的示例中，我们有一个名称列表。 我们正在使用`transform()`方法执行两个操作（修剪空白并使所有名称都大写）。

```java
 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](https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.4) 中所述，并且其实例可以名义上将自己描述为`ConstantDesc`。

`resolveConstantDesc()`与`describeConstable()`相似，不同之处在于此方法改为返回`ConstantDesc`的实例。

## 3\. `Files.mismatch(Path, Path)`

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

`mismatch()`方法比较两个文件路径并返回`long`值。 `long`表示两个文件内容中第一个不匹配字节的位置。 如果文件“相等”，则返回值为` – 1`。

```java
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)`，用于创建精简数字表示形式。

```java
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`语句**](https://howtodoinjava.com/java/basics/switch-statement-in-java/) ，以便可以将其用作语句或表达式。

不必为每个`case`块定义[`break`](https://howtodoinjava.com/java/basics/break-keyword/)语句，我们只需使用**箭头语法**即可。 箭头语法在语义上看起来像 lambda，并且将`case`标签与表达式分开。

使用新的`switch`表达式，我们可以将`switch`语句直接分配给变量。

```java
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 更改的问题**。

学习愉快！