我有一个HashMap,其中包含一个键:字符串(要实例化的对象的名称)和值:列表(实例化的对象的变量)
我当前的方法:
public Map<Room,List<String>> buildRoomObjects(Map<String,List<String>> map){
List<Room> rooms = map.keySet().stream().map(Room::new).collect(Collectors.toList());
Map<Room,List<String>> newmap = new HashMap<>();
for ( Room room : rooms){
newmap.put(room,map.get(room.getName()));
}
return newmap;
}
我可以在这里避免使用增强的for Loop并压缩为单个流吗?
答案 0 :(得分:4)
您可以流播entrySet,然后使用Collectors.toMap。使用lambda表达式entry -> new Room(entry.getKey())
来映射Room
作为键,然后映射对应的值
Map<Room, List<String>> newmap = map.entrySet().stream()
.collect(Collectors.toMap(entry -> new Room(entry.getKey()), Map.Entry::getValue));
如果您可能有重复的键,则可以将toMap
与BinaryOperator
一起使用
如果映射的键包含重复项(根据Object.equals(Object)),则执行收集操作时将抛出IllegalStateException。如果映射的键可能有重复,请改用toMap(Function, Function, BinaryOperator)。