用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->“”)代码>