【问题标题】:Is it possible to use the map interface with io.vavr.collection.HashMap?是否可以将地图接口与 io.vavr.collection.HashMap 一起使用?
【发布时间】:2018-08-24 04:33:52
【问题描述】:

在尝试使用 Vavr 的不可变映射 (io.vavr.collection.HashMap) 和 java.util.Map 接口时,我没有设法编译代码 - 至少不是通过使用 @ 中的 .of() 静态方法987654327@.

本质上这是我正在使用的 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() {
    }
}

这是我得到的错误:

不兼容的类型。必需的地图,但推断出“的” 到 HashMap:不存在类型变量 K、V 的实例,所以 HashMap 符合 Map

知道如何将io.vavr.collection.HashMap 的实例分配给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

网上有一些例子似乎是可行的,比如在blog 上,您可以在其中找到此代码:

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

【问题讨论】:

    标签: java vavr


    【解决方案1】:

    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 的方法总是返回一个新的 @ 987654337@ 实例(或相同实例,以防地图未更改)。

    比较 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 关联。)

    vavrMap.put

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

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

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

    【讨论】:

    • 哦,是的,我注意到这是另一个地图界面。非常感谢您的澄清。
    【解决方案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();
       }
    
    }
    

    【讨论】:

    • 谢谢。我不知道这种方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 2015-09-20
    • 1970-01-01
    • 2021-11-12
    • 2016-04-01
    相关资源
    最近更新 更多