1. 概述
在这个简短的教程中,我们将介绍如何在Java中将HashMap
的值转换为ArrayList
。
首先,我们将解释使用核心Java方法如何实现这一过程。接着,我们将展示如何使用Guava等外部库来解决我们的核心问题。
2. 使用核心Java转换
将HashMap
转换为ArrayList
是一个常见的任务。本节将介绍使用Java类和方法进行转换的不同方法。
2.1. 使用ArrayList
构造函数
ArrayList
构造函数是将HashMap
转换为ArrayList
的最常见且简单的方法。
主要思想是将HashMap
的值作为参数传递给ArrayList
构造函数:
ArrayList<String> convertUsingConstructor(HashMap<Integer, String> hashMap) {
if (hashMap == null) {
return null;
}
return new ArrayList<String>(hashMap.values());
}
我们首先检查HashMap
是否为null
以确保方法的健壮性。然后,我们使用values()
方法,它返回一个视图,包含给定HashMap
中的所有值。
现在,让我们通过测试用例验证这一点:
public class HashMapToArrayListConverterUtilsUnitTest {
private HashMap<Integer, String> hashMap;
@Before
public void beforeEach() {
hashMap = new HashMap<>();
hashMap.put(1, "AAA");
hashMap.put(2, "BBB");
hashMap.put(3, "CCC");
hashMap.put(4, "DDD");
}
@Test
public void givenAHashMap_whenConvertUsingConstructor_thenReturnArrayList() {
ArrayList<String> myList = HashMapToArrayListConverterUtils.convertUsingConstructor(hashMap);
assertThat(hashMap.values(), containsInAnyOrder(myList.toArray()));
}
// ...
}
正如预期,测试成功通过。
2.2. 使用addAll()
方法
如果你想将HashMap
转换为ArrayList
,addAll()
方法也是个不错的选择。
顾名思义,这个方法允许将指定集合中的所有元素添加到列表的末尾。
现在,让我们演示addAll()
方法的用法:
ArrayList<String> convertUsingAddAllMethod(HashMap<Integer, String> hashMap) {
if (hashMap == null) {
return null;
}
ArrayList<String> arrayList = new ArrayList<String>(hashMap.size());
arrayList.addAll(hashMap.values());
return arrayList;
}
如上所示,我们首先创建了一个与传递的HashMap
相同大小的ArrayList
。然后,我们调用addAll()
方法将HashMap
的所有值添加到列表中。
再次,让我们添加一个新的测试用例以确认一切按预期工作:
@Test
public void givenAHashMap_whenConvertUsingAddAllMethod_thenReturnArrayList() {
ArrayList<String> myList = HashMapToArrayListConverterUtils.convertUsingAddAllMethod(hashMap);
assertThat(hashMap.values(), containsInAnyOrder(myList.toArray()));
}
不出所料,测试用例成功通过。
2.3. 使用Stream API
Java 8引入了许多新功能和增强。其中一项功能就是Stream API。
现在,让我们通过一个实际例子来说明如何使用Stream API将HashMap
转换为ArrayList
:
ArrayList<String> convertUsingStreamApi(HashMap<Integer, String> hashMap) {
if (hashMap == null) {
return null;
}
return hashMap.values()
.stream()
.collect(Collectors.toCollection(ArrayList::new));
}
简而言之,我们从给定HashMap
的值创建了一个流。然后,我们使用collect()
方法和Collectors
类创建了一个新的ArrayList
,其中包含了流中的元素。
一如既往地,我们用一个新的测试用例验证我们的方法:
@Test
public void givenAHashMap_whenConvertUsingStreamApi_thenReturnArrayList() {
ArrayList<String> myList = HashMapToArrayListConverterUtils.convertUsingStreamApi(hashMap);
assertThat(hashMap.values(), containsInAnyOrder(myList.toArray()));
}
2.4. 使用传统的循环
另一种方法是使用传统的for
循环来达到同样的目标:
ArrayList<String> convertUsingForLoop(HashMap<Integer, String> hashMap) {
if (hashMap == null) {
return null;
}
ArrayList<String> arrayList = new ArrayList<String>(hashMap.size());
for (Map.Entry<Integer, String> entry : hashMap.entrySet()) {
arrayList.add(entry.getValue());
}
return arrayList;
}
如上所示,我们遍历了HashMap
的条目。此外,我们在每个Entry
上使用entry.getValue()
获取其值,然后使用add()
方法将返回的值添加到ArrayList
中。
最后,我们用另一个测试用例测试我们的方法:
@Test
public void givenAHashMap_whenConvertUsingForLoop_thenReturnArrayList() {
ArrayList<String> myList = HashMapToArrayListConverterUtils.convertUsingForLoop(hashMap);
assertThat(hashMap.values(), containsInAnyOrder(myList.toArray()));
}
3. 使用Guava
Guava 提供了一套丰富的实用工具类,简化了诸如集合操作之类的常见编程任务。
首先,我们需要在pom.xml
文件中添加Guava依赖:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>
Guava库提供了Lists
工具类,主要用于处理列表。让我们在实践中看看:
public ArrayList<String> convertUsingGuava(HashMap<Integer, String> hashMap) {
if (hashMap == null) {
return null;
}
EntryTransformer<Integer, String, String> entryMapTransformer = (key, value) -> value;
return Lists.newArrayList(Maps.transformEntries(hashMap, entryMapTransformer)
.values());
}
Lists
类提供了newArrayList()
方法,根据给定的元素创建一个新的ArrayList
。
如上所示,我们使用自定义的EntryTransformer
从键值对中获取值。然后,我们将转换器传递给Maps.transformEntries()
方法,同时提供HashMap
。
这样,我们告诉Guava根据HashMap
的值创建一个新的ArrayList
。
最后,我们为我们的方法添加一个测试用例:
@Test
public void givenAHashMap_whenConvertUsingGuava_thenReturnArrayList() {
ArrayList<String> myList = HashMapToArrayListConverterUtils.convertUsingGuava(hashMap);
assertThat(hashMap.values(), containsInAnyOrder(myList.toArray()));
}
4. 总结
在这篇文章中,我们探讨了在Java中将HashMap
转换为ArrayList
的不同方式。
我们首先了解了使用核心Java的方法,然后展示了如何使用第三方库实现相同的目标。
本文中的代码可以在GitHub上找到。