在 Java 中创建一行中具有键和值的映射



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

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

方便工厂的集合方法

在 Java 9 中,JEP 269 定义了一些新的 Map 帮助程序方法:集合的便利工厂方法

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"));

如果需要在早期版本中执行此操作,可以编写类似的帮助程序方法。

在Java 8中,您可以使用以下方法,如下所述:

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

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

使用流

假设您的数据位于包含可以使用任意 getter 访问的Data对象的ArrayList中,则可以使用 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");
}});

由于此方法可能会导致内存泄漏,因此强烈建议不要使用。

使用番石榴

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

从Java 9开始,有更好的语法糖可用,如David的回答所述。

最新更新