用Java从一组关键对象实例化映射

用Java从一组关键对象实例化映射,java,dictionary,set,instantiation,Java,Dictionary,Set,Instantiation,给定要用作键的对象集,如何轻松获得映射实例,并将值保留为null 其目的是在确定要存储的值之前,使用键预先填充地图 当然,我可以创建一个空映射,然后循环一组可能的关键对象,同时对每个对象执行put,并将null作为值 Setmonths=EnumSet.of(Month.三月、Month.五月、Month.六月); MapMap=newenummap(Month.class); 用于(月:月) { map.put(月,空); } 我只是想知道是否有一个巧妙的技巧可以用更少的代码来实现这一点。类

给定要用作键的
对象集
,如何轻松获得
映射
实例,并将值保留为null

其目的是在确定要存储的值之前,使用键预先填充地图

当然,我可以创建一个空映射,然后循环一组可能的关键对象,同时对每个对象执行
put
,并将
null
作为值

Setmonths=EnumSet.of(Month.三月、Month.五月、Month.六月);
MapMap=newenummap(Month.class);
用于(月:月)
{
map.put(月,空);
}
我只是想知道是否有一个巧妙的技巧可以用更少的代码来实现这一点。类似于.

Collectors.toMap()
和静态工厂方法(如
Map.of()
)的相反内容在内部使用
Map.merge
,如果键或值为null,它将抛出NPE

请参阅此帖子:。请参阅OpenJDK项目的本期页面:

您可以通过使用三个参数签名作为缩减来解决这个问题

collect(Supplier supplier, BiConsumer accumulator, BiConsumer combiner)
比如:

Setmonths=EnumSet.of(Month.三月、Month.五月、Month.六月);
MapmyMap=
月数
.收集(
HashMap::新建,
(map,val)->map.put(val,null),
HashMap::putAll
);
System.out.println(myMap);
你看

但我不确定这是否比使用经典for循环

collector.toMap()
和静态工厂方法(如
Map.of()
)的方法更具可读性或更优雅,如果键或值为空,它将抛出NPE

请参阅此帖子:。请参阅OpenJDK项目的本期页面:

您可以通过使用三个参数签名作为缩减来解决这个问题

collect(Supplier supplier, BiConsumer accumulator, BiConsumer combiner)
比如:

Setmonths=EnumSet.of(Month.三月、Month.五月、Month.六月);
MapmyMap=
月数
.收集(
HashMap::新建,
(map,val)->map.put(val,null),
HashMap::putAll
);
System.out.println(myMap);
你看


但我不确定这是否比使用经典for循环的方法更具可读性或更优雅

什么类型的
映射
?您可以编写自己的
映射
实现,该实现接受
进行初始化和/或由
支持。否则就不可能了。使用for循环或
(本质上与for循环相同)
..
EDIT:用键预先填充
Map
的原因是什么?@BenjaminM任何
Map
实现都可以。我总是可以将该映射传递给我想要的另一个
map
的构造函数。什么类型的
map
?您可以编写自己的
映射
实现,该实现接受
进行初始化和/或由
支持。否则就不可能了。使用for循环或
(本质上与for循环相同)
..
EDIT:用键预先填充
Map
的原因是什么?@BenjaminM任何
Map
实现都可以。我总是可以将该映射传递给我想要的另一个
map
的构造函数。我似乎无法让该代码正常工作。我不确定运行时的错误。我怀疑不允许使用空值。请参阅代码。如果我们使用空字符串作为值而不是null,则该代码确实有效。看
MapMap=Set.of(Month.MARCH,Month.MAY,Month.JUNE).stream().collect(Collectors.toMap(k->k,k->“”)我似乎无法让代码正常工作。我不确定运行时的错误。我怀疑不允许使用空值。请参阅代码。如果我们使用空字符串作为值而不是null,则该代码确实有效。看
MapMap=Set.of(Month.MARCH,Month.MAY,Month.JUNE).stream().collect(Collectors.toMap(k->k,k->“”)