Java 8 ConcurrentHashMap 初始化

标签 java dictionary java-8 java-stream concurrenthashmap

我正在寻找一种“干净且简单”的方法来初始化 ConcurrentHashMap。

对于 Java 8,我有这个:-

private static final Map<String, String> myStreamedMap = Stream.of(
        new AbstractMap.SimpleImmutableEntry<>("Key1", "Value1"), 
        new AbstractMap.SimpleImmutableEntry<>("Key2", "Value2"), 
        new AbstractMap.SimpleImmutableEntry<>("Key3", "Value3"), 
        new AbstractMap.SimpleImmutableEntry<>("Key4", "Value4")).
        collect(Collectors.toMap((entry) -> entry.getKey(), (entry) -> entry.getValue()));

这提供了我想要的最终结果,但是我觉得

"new AbstractMap.SimpleImmutableEntry<> "

很难看清发生了什么。

有什么方法可以“隐藏”它并保持在一行中吗?

更新

想出了这个(显而易见的)解决方案

private static final Map<String, String> myStreamedMapWith = Stream.of(
        with("Key1", "Value1"), 
        with("Key2", "Value2"), 
        with("Key3", "Value3"), 
        with("Key4", "Value4")).
        collect(Collectors.toMap((entry) -> entry.getKey(), (entry) -> entry.getValue()));

private static AbstractMap.SimpleImmutableEntry<String, String> with(final String key, final String value) {
    return new AbstractMap.SimpleImmutableEntry<>(key, value);
}

最佳答案

在 Java 9 发布之前,没有方便的内置 map 初始化方法,所以我建议查看第三方库(如 Google 的 Guava):

new ConcurrentHashMap<>(com.google.common.collect.ImmutableMap.of("Key1", "Value1"));

无论如何,这里的主要问题是您正在创建 HashMap 的实例。 .

来自 Collectors.toMap来源:

return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new);

如果您不想使用任何外部库,一个好的方法是使用 the Builder pattern .这是一个简单的例子:

class MapBuilder<K, V> {

    private List<Map.Entry<K, V>> entries = new ArrayList<>();

    public MapBuilder<K, V> with(K key, V value) {
        entries.add(new AbstractMap.SimpleImmutableEntry<>(key, value));

        return this;
    }

    public Map<K, V> build(Supplier<Map<K, V>> mapSupplier) {
        return entries.stream().collect(Collectors.toMap(
                Map.Entry::getKey,
                Map.Entry::getValue,
                (k1, k2) -> k1,
                mapSupplier
                )
        );
    }

}

及其演示:

new MapBuilder().with("Key1", "Value1")
                .with("Key2", "Value2")
                .build(ConcurrentHashMap::new);

为了完全独立于实现(AbstractMap.SimpleImmutableEntry),我建议引入一个采用 BiFunction<KEY, VALUE, Map.Entry<KEY, VALUE>> 的构造函数入口初始化器作为参数:

class MapBuilder<K, V> {

    private List<Map.Entry<K, V>> entries;
    private BiFunction<K, V, Map.Entry<K, V>> function;

    public MapBuilder() {
        entries = new ArrayList<>();
    }

    public MapBuilder(BiFunction<K, V, Map.Entry<K, V>> function) {
        this();
        this.function = function;
    }

    public MapBuilder<K, V> with(K key, V value) {
        entries.add(function.apply(key, value));

        return this;
    }

    public Map<K, V> build(Supplier<Map<K, V>> mapSupplier) { ... }

}

调用将更改为:

new MapBuilder<>(AbstractMap.SimpleImmutableEntry::new);

此时,我们可以决定分别为条目和 map 选择哪种实现方式。

关于Java 8 ConcurrentHashMap 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45508408/

相关文章:

list - 如何更新列表的一个元素

java - 如何将工具提示添加到 JavaFX 8 中的 TableView 标题单元格

java - Java 中与 Stack 相关的几个问题

python - 如何解决 + : 'int' and 'tuple' because of trying to return 2 values with lambda? 不受支持的操作数类型

数组中的 Ruby map 方法

java - 是否有用于简单列表映射的 Java 8 实用程序?

java - 交替多次try catch处理异常

java - 完全展开 Jtree 的所有节点(包括子节点)

java - Android:AsyncTask 内的 Java Net Socket 异常

java - 为什么 Spring Boot 应用程序在 Azure Web 应用程序上部署后无法运行