1

在尝试将Vavr的不可变映射 ( io.vavr.collection.HashMap) 与java.util.Map接口一起使用时,我没有设法让代码编译 - 至少不是通过.of()使用 io.vavr.collection.HashMap.

本质上,这是我正在使用的 Maven 依赖项:

<dependency>
    <groupId>io.vavr</groupId>
    <artifactId>vavr</artifactId>
    <version>0.9.2</version>
</dependency>

使用 Java 1.8

这是代码:

import io.vavr.collection.HashMap;

import java.util.Map;

public class EntityKeyMap {

    public static final Map<String, String> map = 
            HashMap.of("key1", "val1", "key2", "val2", "key3", "val3");

    private EntityKeyMap() {
    }
}

这是我得到的错误:

不兼容的类型。必需的 Map 但 'of' 被推断为 HashMap:不存在类型变量 K、V 的实例,因此 HashMap 符合 Map

任何想法如何分配io.vavr.collection.HashMapto的实例java.util.Map?这甚至可能吗?

根据io.vavr.collection.HashMap文档,它实现了java.util.Map接口:

https://static.javadoc.io/io.vavr/vavr/0.9.2/io/vavr/collection/HashMap.html

网上有一些似乎可行的例子,比如在这个博客上你可以找到这段代码:

Map<String, String> map1
  = HashMap.of("key1", "val1", "key2", "val2", "key3", "val3");
4

2 回答 2

4

VavrHashMap没有实现JDK 的Map接口。Map它实现的接口是vavr自己的Map接口。

与 JDK 相比Map,vavrMap表示不可变映射,HashMap是一种基于哈希数组映射 trie的高效持久映射实现。

MapJDK接口和 vavr接口之间最根本的区别在于MapJDK 映射具有改变映射内部状态的方法,而vavr的方法总是返回一个新Map实例(或者在映射没有改变的情况下返回相同的实例)。

比较 JDKMap.put与 vavr 的Map.put方法签名。

JDKMap.put

V put(K key, V value)

将指定值与此映射中的指定键关联(可选操作)。如果映射先前包含键的映射,则旧值将替换为指定值。(当且仅当 m.containsKey(k) 返回 true 时,映射 m 被称为包含键 k 的映射。)
返回:与 key 关联的先前值,如果没有 key 映射,则返回 null。(如果实现支持空值,则返回空值还可以指示映射先前将空值与键关联。)

vavrMap.put

Map<K,V> put(K key, V value)

将指定的值与此映射中的指定键相关联。如果映射先前包含键的映射,则旧值将替换为指定值。
返回:包含这些元素和该条目的新 Map。

如果您需要 JDK 映射,您可以将 vavr 映射转换为Map.toJavaMap,但这将创建映射内容的完整副本,因为 JDK 映射的可变性质与 vavr 的不可变方法不兼容。

于 2018-08-23T20:33:52.243 回答
2

toJavaMap专门为此目的的方法:

将此 Vavr Map 转换为 java.util.Map,同时保留插入顺序 (LinkedHashMap) 和排序顺序 (SortedMap) 等特征。

import io.vavr.collection.HashMap;

public class VavrPlayground {

   public static final HashMap<String, String> map =
       HashMap.of("key1", "val1", "key2", "val2", "key3", "val3");

   public void EntityKeyMap() {
      java.util.Map<String, String> jMap = map.toJavaMap();
   }

}
于 2018-08-23T08:55:33.060 回答