有没有办法同时创建带有键和值的映射(我的意思是单行代码(?例如,我创建了一个名为 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的回答所述。