从现有数据构建集合

标准集合

Java Collections 框架

从单个数据值构造 List 的简单方法是使用 java.utils.Arrays 方法 Arrays.asList

List<String> data = Arrays.asList("ab", "bc", "cd", "ab", "bc", "cd");

所有标准集合实现都提供构造函数,这些构造函数将另一个集合作为参数在构造时将所有元素添加到新集合:

List<String> list = new ArrayList<>(data); // will add data as is
Set<String> set1 = new HashSet<>(data); // will add data keeping only unique values
SortedSet<String> set2 = new TreeSet<>(data); // will add data keeping unique values and sorting
Set<String> set3 = new LinkedHashSet<>(data); // will add data keeping only unique values and preserving the original order

Google Guava Collections 框架

另一个伟大的框架是 Google Guava,它是一个惊人的实用类(提供方便的静态方法),用于构建不同类型的标准集合 ListsSets

 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 ...
 List<String> list1 = Lists.newArrayList("ab", "bc", "cd");
 List<String> list2 = Lists.newArrayList(data);
 Set<String> set4 = Sets.newHashSet(data);
 SortedSet<String> set5 = Sets.newTreeSet("bc", "cd", "ab", "bc", "cd");

映射集合

Java Collections 框架

类似地,对于地图,给定一个 Map<String, Object> map,可以使用以下所有元素构建新地图:

Map<String, Object> map1 = new HashMap<>(map);
SortedMap<String, Object> map2 = new TreeMap<>(map);

Apache Commons Collections 框架

使用 Apache Commons 你可以在 ArrayUtils.toMapMapUtils.toMap 中使用数组创建 Map:

 import org.apache.commons.lang3.ArrayUtils;
 ...
 // Taken from org.apache.commons.lang.ArrayUtils#toMap JavaDoc

 // Create a Map mapping colors.
 Map colorMap = MapUtils.toMap(new String[][] {{
     {"RED", "#FF0000"},
     {"GREEN", "#00FF00"},
     {"BLUE", "#0000FF"}});

数组的每个元素必须是 Map.Entry 或包含至少两个元素的数组,其中第一个元素用作键,第二个元素用作值。

Google Guava Collections 框架

Google Guava 框架的实用程序类命名为 Maps

 import com.google.common.collect.Maps;
 ...
 void howToCreateMapsMethod(Function<? super K,V> valueFunction,
           Iterable<K> keys1, 
           Set<K> keys2, 
           SortedSet<K> keys3) {
     ImmutableMap<K, V> map1 = toMap(keys1, valueFunction); // Immutable copy
     Map<K, V> map2 = asMap(keys2, valueFunction); // Live Map view
     SortedMap<K, V> map3 = toMap(keys3, valueFunction); // Live Map view
 }
Version => Java SE 8

使用 Stream

Stream.of("xyz", "abc").collect(Collectors.toList());

要么

Arrays.stream("xyz", "abc").collect(Collectors.toList());