从现有数据构建集合
标准集合
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
,它是一个惊人的实用类(提供方便的静态方法),用于构建不同类型的标准集合 Lists
和 Sets
:
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.toMap
和 MapUtils.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());