【问题标题】:Add HashMap into list then add generated list to new HashMap using a lambda expression将 HashMap 添加到列表中,然后使用 lambda 表达式将生成的列表添加到新的 HashMap
【发布时间】:2021-10-10 13:42:20
【问题描述】:

我有下面的代码,它工作正常。 在这段代码中,它在 LinkedHashMap 中添加一个元素,然后将该 Map 添加到一个新列表中,最后将该列表添加到另一个 LinkedHashMap 中。 我正在尝试使用 java8 找到一种更好的快捷方式以使其更简单和简短,有什么建议吗?

private Object getData() {
        LinkedHashMap<String, String> secondLevelMap = new LinkedHashMap<>();
        secondLevelMap.put("href", "http://SomeLink");
        List<LinkedHashMap> firstLevelList = new ArrayList<>(2);
        firstLevelList.add(null);
        firstLevelList.add(secondLevelMap);
        LinkedHashMap<String, List<LinkedHashMap>> firstLevelMap = new LinkedHashMap<>();
        firstLevelMap.put("links", firstLevelList);
        return firstLevelMap;
    }

【问题讨论】:

  • 对我来说看起来不错,尽管我会观察到您应该返回一些比 Object 更具体的东西,而 List&lt;LinkedHashMap 可能应该减少到 List&lt;Map&gt;。在更高版本的 Java 中,您有 list.of() 这可能会有所帮助(尽管它是空敌对的)
  • 如果里面有单个元素,为什么要LinkedHashMap?这听起来像XY problem
  • 这对我来说看起来不太好,因为使用了 原始类型。您不应该使用它们,而是提供所有必要的类型参数。

标签: java lambda java-8


【解决方案1】:

这里可以实现几个辅助方法来使用Supplier&lt;Map&gt; 创建地图,用默认键值填充它并返回地图。

对于列表,有Arrays.asList 方法可以从对象创建列表,如果固定大小的列表可以使用,可以按原样使用,也可以包装到new ArrayList&lt;&gt;(Arrays.asList(...)) 中以创建完整的列表可变列表。

private static <K, V> Map<K, V> createMap(K key, V value) {
    return createMap(key, value, LinkedHashMap::new);
}

private static <K, V> Map<K, V> createMap(K key, V value, Supplier<Map<K, V>> mapSupplier) {
    Map<K, V> map = mapSupplier.get();
    map.put(key, value);

    return map;
}

那么getData 可以重写如下(另外,修复了返回类型中的原始Object):

public Map<String, List<Map<String, String>>> getData() {
    return createMap("links", new ArrayList<>(
            Arrays.asList(null, createMap("href", "http://SomeLink"))
    ));
}

测试

System.out.println(new MyClass().getData());

输出:

{links=[null, {href=http://SomeLink}]}

出于练习目的,可以定义几个“lambdas”来引用具有特定类型参数的createMap 方法:

BiFunction<String, String, Map<String, String>> innerMapSupplier = (k, v) -> MyClass.createMap(k, v);
BiFunction<String, List<Map<String, String>>, Map<String, List<Map<String, String>>>> resultMapSupplier = (k, v) -> MyClass.createMap(k, v);

System.out.println(
    resultMapSupplier.apply("links", Arrays.asList(
        null, 
        innerMapSupplier.apply("href", "http://SomeLink")
    ))
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 2018-09-05
    • 1970-01-01
    • 2017-02-20
    • 2021-11-21
    • 1970-01-01
    相关资源
    最近更新 更多