给定一个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));