在尝试通过io.vavr.collection.HashMap
接口使用Vavr的不变映射(java.util.Map
)时,我没有设法使代码得以编译-至少不是通过使用{ .of()
中的{1}}静态方法。
本质上,这是我正在使用的Maven依赖项:
io.vavr.collection.HashMap
使用Java 1.8
这是代码:
<dependency>
<groupId>io.vavr</groupId>
<artifactId>vavr</artifactId>
<version>0.9.2</version>
</dependency>
这是我得到的错误:
不兼容的类型。必填地图,但推断出“ of” 到HashMap:不存在类型变量K,V的实例,因此 HashMap符合Map
有什么想法可以将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() {
}
}
的实例分配给io.vavr.collection.HashMap
?那有可能吗?
根据java.util.Map
文档,它实现了io.vavr.collection.HashMap
接口:
https://static.javadoc.io/io.vavr/vavr/0.9.2/io/vavr/collection/HashMap.html
网络上似乎有一些示例,例如在blog上,您可以找到以下代码:
java.util.Map
答案 0 :(得分:4)
Vavr的HashMap
未实现JDK's Map
接口。它实现的Map
接口是vavr's own Map
接口。
与JDK的Map
相比,vavr的Map
表示不可变映射,HashMap
是基于Hash array mapped trie的高效持久映射实现。
JDK Map
接口和vavr Map
接口之间最根本的区别在于,JDK映射具有变异映射内部状态的方法,而vavr的方法始终返回一个新的Map
实例(如果地图不变,则返回相同的实例)。
比较JDK的Map.put
与vavr的Map.put
方法签名。
JDK Map.put
:
V put(K key, V value)
在此映射中将指定的值与指定的键相关联(可选操作)。如果该映射先前包含该键的映射,则旧值将替换为指定值。 (仅当m.containsKey(k)返回true时,映射m才包含键k的映射。)
返回值::与键关联的先前值;如果没有键的映射关系,则为null。 (如果实现支持null值,则返回null还可表示映射先前将null与key关联。)
vavr Map.put
:
Map<K,V> put(K key, V value)
在此映射中将指定的值与指定的键相关联。如果该映射先前包含该键的映射,则旧值将替换为指定值。
返回:包含这些元素和该条目的新Map。
如果您需要JDK映射,则可以使用Map.toJavaMap
转换vavr映射,但这将创建映射内容的完整副本,因为JDK映射的可变性质与的不变方法不兼容。 vavr。
答案 1 :(得分:2)
有一种toJavaMap
方法正好用于此目的:
将此Vavr映射转换为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();
}
}