【问题标题】:Create a map with key and value in one line in Java在 Java 中的一行中创建具有键和值的映射
【发布时间】:2017-06-25 08:51:41
【问题描述】:

有没有办法同时创建一个包含键和值的映射(我的意思是单行代码)?例如,我创建了一个名为 map 的映射,每当我想添加一对新的键/值时,我都需要使用方法“put”。在我们创建地图时,是否有更短的方法来填充地图?

Map<String, String> map = new HashMap<String, String>();
    map.put("A", "32");
    map.put("C", "34");
    map.put("T", "53");

【问题讨论】:

  • 一行行做一件事有什么价值?可读性?不。可维护性?没有。性能?没有。
  • 只是为了好玩,不是吗?
  • @Andremoniy 我可以考虑许多其他更有趣的事情,但这主要是基于意见;)
  • 是什么阻止您将所有内容集中在一行上?
  • @alfasin 如果您需要作为参数传递,或者从 lambda 返回映射,则该值将是一个值。例如,configure(Map.of("width", 640, "height", 480)) 换句话说,任何你想写成表达式的地方。

标签: java dictionary


【解决方案1】:

集合的便利工厂方法

Java 9 中有一些new Map helper methodsJEP 269: Convenience Factory Methods for Collections 定义。

Map<String, String> map = Map.of("A", "32", "C", "34", "T", "53");

但这仅适用于最多 10 个条目。超过十个,使用:

import static java.util.Map.entry;

Map<String, String> map = Map.ofEntries(
    entry("A", "32"), entry("C", "34"), entry("T", "53"));

如果您需要在早期版本中编写类似的辅助方法。

【讨论】:

    【解决方案2】:

    在 Java 8 中,您可以使用以下方法 explained here

    如果您只需要一个快速的不可变单条目或空映射

    Map<String, String> map = Collections.singletonMap("A", "32");
    
    Map<String, String> map = Collections.emptyMap();
    

    使用流

    假设您的数据在包含您的 Data 的对象的 ArrayList 中,可以使用任意 getter 访问,您可以使用 Streams API:

    List<Data> dataList = new ArrayList<>();
    // .... populate data list
    Map<String, Integer> nameToAge = dataList.stream().collect(
        Collectors.toMap(Data::getFooAsKey, Data::getBarAsValue)
    );
    

    ...或使用内联映射方法(如果您没有/不需要/想要创建dataList):

    Map<String, Integer> map = Stream.of( 
        new Data("A", "32"), new Data("C", "34"), new Data("C", "34")
    ).collect(Collectors.toMap(User::getFooAsKey, User::getBarAsValue));
    

    匿名子类(不鼓励)

    Map<String, String> map = new HashMap<String, String>({{
        put("A", "32");
        put("C", "34");
        put("T", "53");
    }});
    

    由于这种方法can cause memory leaks 强烈反对。

    使用番石榴

    Map<String, String> immutableMap = Maps.newHashMap(
        ImmutableMap.of("A", "32", "C", "34", "T", "53")
    );
    

    从 Java 9 开始,可以使用高级语法糖,如 David's answer 中所述。

    【讨论】:

    • 酷!您能否提供有关匿名子类实现中内存泄漏的更多详细信息。请问?
    • @stanley 基本上所有非静态内部类都有可能导致内存泄漏 b/c 的 GC 工作方式,如 this SO post 中所述。关于匿名子类初始化技巧,询问 ecosia / google 会返回一些关于此的文章,例如 this one(我现在已将其链接到答案中)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 2022-07-22
    相关资源
    最近更新 更多