可以将地图界面与io.vavr.collection.HashMap一起使用吗?

时间:2018-08-23 08:03:20

标签: java vavr

在尝试通过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

2 个答案:

答案 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();
   }

}