使用流将HashMap <String,List <String >>转换为HashMap <Object,List <String >>

时间:2019-11-24 17:21:24

标签: java java-8 java-stream

我有一个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并压缩为单个流吗?

1 个答案:

答案 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));

如果您可能有重复的键,则可以将toMapBinaryOperator一起使用

  

如果映射的键包含重复项(根据Object.equals(Object)),则执行收集操作时将抛出IllegalStateException。如果映射的键可能有重复,请改用toMap(Function, Function, BinaryOperator)