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转换为ArrayListaddAll()方法也是个不错的选择。

顾名思义,这个方法允许将指定集合中的所有元素添加到列表的末尾

现在,让我们演示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上找到。