在Java中从一组键对象实例化一个Map



给定一个Set的对象,我想用作为键,我怎么能很容易地得到一个Map实例离开值为空?

目的是在确定要存储的值之前预先用键填充映射。

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

Set< Month > months = EnumSet.of( Month.MARCH , Month.MAY , Month.JUNE ) ; 
Map< Month , String > map = new EnumMap<>( Month.class ) ;
for( Month month : months ) 
{
map.put( month , null ) ;
}

我只是想知道是否有一个漂亮的技巧可以用更少的代码来做到这一点。类似于Map#keySet的反面。

Collectors.toMap()Map.of()等静态工厂方法在内部使用Map.merge,如果key或value为null,则会抛出NPE。

请参阅此帖子:java-8-nullpointerexception-in-collectors-tomap。请参阅OpenJDK项目的问题页:JDK-8148463 collector。

您可以通过使用Stream.collect和三个参数签名来简化。

collect(Supplier supplier, BiConsumer accumulator, BiConsumer combiner)

类似:

Set< Month > months = EnumSet.of( Month.MARCH , Month.MAY , Month.JUNE ) ;         
Map< Month , String > myMap = 
months.stream()
.collect(
HashMap::new , 
( map , val )-> map.put( val , null ) , 
HashMap::putAll
);

System.out.println(myMap);

查看代码运行在IdeOne.com。

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

的方法更可读或更优雅
set.stream().collect(Collectors.toMap(k -> k, k -> null));

相关内容

  • 没有找到相关文章

最新更新