【问题标题】:Converting Array to HashMap using Java 8 Stream使用 Java 8 Stream 将数组转换为 HashMap
【发布时间】:2019-12-06 09:32:15
【问题描述】:

我正在编写一个使用 Java 8 Stream 将数组转换为 Map 的函数。

    public static <K, V> Map<K, V> toMap(Object... entries) {
    // Requirements:
    // entries must be K1, V1, K2, V2, .... ( even length )
    if (entries.length % 2 == 1) {
        throw new IllegalArgumentException("Invalid entries");
    }

    // TODO
    Arrays.stream(entries).????
}

有效用法

    Map<String, Integer> map1 = toMap("k1", 1, "k2", 2);

    Map<String, String> map2 = toMap("k1", "v1", "k2", "v2", "k3", "v3");

无效用法

    Map<String, Integer> map1 = toMap("k1", 1, "k2", 2, "k3");

有什么帮助吗?

谢谢!

【问题讨论】:

  • 你这样做的目的是什么? Map.of 存在。

标签: java json string hashmap


【解决方案1】:

你可以这样使用它

Map map = ArrayUtils.toMap(arrayName);

您可以从以下位置导入 ArrayUtils:

import org.apache.commons.lang3.ArrayUtils;

只需包含 Apache JAR

【讨论】:

    【解决方案2】:

    您是否意识到它已经存在?从Java 9 开始就一直存在。

    以下创建一个键和值的不可变映射。

     Map<String, String> map2 = Map.of("k1", "v1", "k2", "v2", "k3", "v3");
    

    对于可变映射来说

     Map<String, String> map2 = new HashMap<>(Map.of("k1", "v1", "k2", "v2", "k3", "v3"));
    

    【讨论】:

    • 这个问题明确提到了 Java 8,所以 Java 9 超出了这个问题的范围
    【解决方案3】:

    你可以使用

        public static <K, V> Map<K, V> toMap(
                                   Class<K> keyType, Class<V> valueType, Object... entries) {
        if(entries.length % 2 == 1)
            throw new IllegalArgumentException("Invalid entries");
        return IntStream.range(0, entries.length/2).map(i -> i*2)
            .collect(HashMap::new,
                     (m,i)->m.put(keyType.cast(entries[i]), valueType.cast(entries[i+1])),
                     Map::putAll);
    }
    

    【讨论】:

      猜你喜欢
      • 2017-06-16
      • 2014-07-18
      • 2018-05-03
      • 1970-01-01
      • 2021-03-28
      • 2014-07-20
      • 1970-01-01
      相关资源
      最近更新 更多