# Java 集合的便利工厂方法

原文：http://zetcode.com/articles/jep269/

本文介绍了 JDK 9 中引入的用于集合的便捷工厂方法。JEP（Java 增强过程）269 引入了新的 API，以使创建具有少量元素的集合和映射实例更加方便。

目的是减轻 Java 编程语言中没有集合字面值的痛苦。 故意将 API 保持为最小。

它在`List`，`Set`和`Map`接口上包含新的静态工厂方法，用于创建集合的不可修改实例。

## 安装 JDK 9 EA

我们从 [jdk9.java.net/download/](https://jdk9.java.net/download/) 下载 JDK 9 早期访问。

```java
$ tar vzfx jdk-9-ea+131_linux-x64_bin.tar.gz

```

在 Linux 上，我们解压缩`jdk-9-ea+131_linux-x64_bin.tar.gz`文件。

```java
$ cd jdk-9/ 
$ ./bin/java -version
java version "9-ea"
Java(TM) SE Runtime Environment (build 9-ea+131)
Java HotSpot(TM) 64-Bit Server VM (build 9-ea+131, mixed mode)

```

我们移至根目录并显示 Java 版本。

目前，NetBeans 和 Eclipse 都不支持 JDK 9。 因此，我们将从命令行运行示例。

有三种新的静态重载方法：

*   `List.of()`
*   `Set.of()`
*   `Map.of()`

该方法创建各个集合的不可修改实例。

## 列表示例

第一个示例使用新的 API 创建一个列表。 列表是一个简单的有序集合，允许重复的元素。

```java
$ tree
.
└── com
    └── zetcode
        └── ListExample.java

2 directories, 1 file

```

我们有这个项目目录结构。

`ListExample.java`

```java
package com.zetcode;

import java.util.List;

public class ListExample {

    public static void main(String[] args) {

        List<String> fruits = List.of("apple", "banana", "plum", "lemon");
        System.out.println(fruits);

        String[] items = {"coin", "pen", "bottle", "spoon"};

        List<String> listOfItems = List.of(items);
        System.out.println(listOfItems);
    }
}

```

在示例中，我们使用新的`List.of()`方法调用创建了两个字符串列表。

```java
List<String> fruits = List.of("apple", "banana", "plum", "lemon");

```

创建一个新列表。 这些项目被指定为`List.of()`参数。

```java
String[] items = {"coin", "pen", "bottle", "spoon"};

List<String> listOfItems = List.of(items);

```

`List.of()`也可以将数组作为参数。

```java
$ ~/bin/jdk1.9/bin/javac -d bin com/zetcode/ListExample.java

```

我们编译代码示例。 二进制文件放入`bin`目录。

```java
$ ~/bin/jdk1.9/bin/java -cp bin com.zetcode.ListExample 
[apple, banana, plum, lemon]
[coin, pen, bottle, spoon]

```

我们运行示例。 这两个列表将打印到控制台。

## 集合示例

在下面的示例中，我们显示了`Set`集合的新 API。 集合是不包含重复元素的集合。

`SetExample.java`

```java
package com.zetcode;

import java.util.Set;
import java.util.TreeSet;

public class SetExample {

    public static void main(String[] args) {

        Set<String> colours = Set.of("blue", "red", "green", "yellow");
        System.out.println(colours);

        String[] names = {"Jane", "Paul", "Robin", "Susan", 
                "Monica", "Jan", "Peter"};

        TreeSet<String> setOfnames = new TreeSet<String>(Set.of(names));
        System.out.println(setOfnames);
    }
}

```

创建两个集合； 第二个按字母顺序排序。

```java
Set<String> colours = Set.of("blue", "red", "green", "yellow");

```

通过`Set.of()`方法调用创建一个新集合。

```java
String[] names = {"Jane", "Paul", "Robin", "Susan", 
        "Monica", "Jan", "Peter"};

TreeSet<String> setOfnames = new TreeSet<String>(Set.of(names));

```

要创建排序集，我们将创建的集传递给`TreeSet`。

```java
$ ~/bin/jdk1.9/bin/javac -d bin com/zetcode/SetExample.java 
$ ~/bin/jdk1.9/bin/java -cp bin com.zetcode.SetExample 
[yellow, red, green, blue]
[Jan, Jane, Monica, Paul, Peter, Robin, Susan]

```

我们编译并运行该示例。

## 映射示例

接下来的两个示例展示了`Map`集合的新 API。 映射是一个包含唯一键/值对的集合。

`MapExample.java`

```java
package com.zetcode;

import java.util.Map;

public class MapExample {

    public static void main(String[] args) {

        Map<String, Integer> items = Map.of("coins", 12, "chairs", 4, "pens", 2);
        items.entrySet().stream().forEach(System.out::println);
    }
}

```

`Map.of()`方法使用两个键值对创建一个新映射。

```java
$ ~/bin/jdk1.9/bin/javac -d bin com/zetcode/MapExample.java 
$ ~/bin/jdk1.9/bin/java -cp bin com.zetcode.MapExample 
coins=12
chairs=4
pens=2

```

我们编译并运行该程序。

在第二个示例中，我们使用`Map.entry()`创建映射元素。 映射条目是一个键值对。

`MapExample2.java`

```java
package com.zetcode;

import java.util.Map;
import static java.util.Map.entry;

public class MapExample2 {

    public static void main(String[] args) {

        Map<Integer,String> map = Map.ofEntries(
            entry(1, "A"),
            entry(2, "B"),
            entry(3, "C"),
            entry(4, "D")
        );

        map.entrySet().stream().forEach(System.out::println);
    }
}

```

使用`Map.ofEntries()`方法创建一个新的条目映射。

```java
$ ~/bin/jdk1.9/bin/javac -d bin com/zetcode/MapExample2.java 
$ ~/bin/jdk1.9/bin/java -cp bin com.zetcode.MapExample2 
1=A
2=B
3=C
4=D

```

We compile and run the program.

在本文中，我们研究了即将发布的 JDK 9 中的新集合 API。

您可能也对以下相关教程感兴趣： [Java 教程](/lang/java/)， [Java 局部变量类型推断](/articles/javavariabletypeinference/)，[用 Java8 的`StringJoiner`连接字符串](/articles/java8stringjoiner/)或 [Google Guava](/articles/guava/) 。