1. 概述

在这个教程中,我们将学习Java中MapMultivaluedMap的区别。在此之前,让我们先看一些示例。

2. Map示例

HashMap实现了Map接口,并允许null值和null键:

@Test
public void givenHashMap_whenEquals_thenTrue() {
    Map<String, Integer> map = new HashMap<>();

    // Putting key-value pairs into our map.
    map.put("first", 1);
    map.put(null, 2);
    map.put("third", null);

    // The assert statements. The last arguments is what's printed if the assertion fails.
    assertNotNull(map, "The HashMap is null!");
    assertEquals(1, map.get("first"), "The key isn't mapped to the right value!");
    assertEquals(2, map.get(null), "HashMap didn't accept null as key!");
    assertEquals(null, map.get("third"), "HashMap didn't accept null value!");
}

上面的单元测试成功通过。我们可以看到,每个键都对应一个确切的值。

3. 如何在项目中使用MultivaluedMap

在使用MultivaluedMap接口及其实现类之前,我们需要将库Jakarta RESTful WS API添加到Maven项目中。为此,我们需要在项目的pom.xml文件中声明依赖:

<dependency>
    <groupId>jakarta.ws.rs</groupId>
    <artifactId>jakarta.ws.rs-api</artifactId>
    <version>3.1.0</version>
</dependency>

我们已成功将库添加到项目中。

4. MultivaluedMap示例

MultivaluedHashMap实现了MultivaluedMap接口,同样允许null值和null键:

@Test
public void givenMultivaluedHashMap_whenEquals_thenTrue() {
    MultivaluedMap<String, Integer> mulmap = new MultivaluedHashMap<>();

    // Mapping keys to values.
    mulmap.addAll("first", 1, 2, 3);
    mulmap.add(null, null);

    // The assert statements. The last argument is what's printed if the assertion fails.
    assertNotNull(mulmap, "The MultivaluedHashMap is null!");
    assertEquals(1, mulmap.getFirst("first"), "The key isn't mapped to the right values!");
    assertEquals(null, mulmap.getFirst(null), "MultivaluedHashMap didn't accept null!");
}

上述单元测试也成功通过。这里,每个键可以映射到一个包含零个或多个元素的值列表。

5. 区别在哪里?

在Java生态系统中,MapMultivaluedMap都是接口。主要区别在于,在Map中,每个键都精确地映射到一个对象。而在MultivaluedMap中,同一个键可以关联零个或多个对象。

此外,MultivaluedMapMap的子接口,因此它继承了Map的所有方法,并且有自己的额外方法。一些实现Map的类有HashMapLinkedHashMapConcurrentHashMapWeakHashMapEnumMapTreeMap。另外,MultivaluedHashMap是一个同时实现MapMultivaluedMap的类。

例如,addFirst(K key, V value)MultivaluedMap的一个方法,它将值添加到提供的键当前值列表的开头:

MultivaluedMap<String, String> mulmap = new MultivaluedHashMap<>();
mulmap.addFirst("firstKey", "firstValue");

相反,getFirst(K key)获取提供的键的第一个值:

String value = mulmap.getFirst("firstKey");

最后,addAll(K key, V... newValues)将多个值添加到提供的键当前的值列表中:

mulmap.addAll("firstKey", "secondValue", "thirdValue");

6. 总结

在这篇文章中,我们了解了MapMultivaluedMap之间的差异。

如往常一样,完整的源代码可以在GitHub上找到。