如何收集地图数据<;整数,列表<;整数>;使用Java流API?

如何收集地图数据<;整数,列表<;整数>;使用Java流API?,java,java-stream,Java,Java Stream,我有一个问题,希望有人能帮助我提高Java流API的知识 我的服务通过RabbitMQ接收来自另一个服务的数据,其数组如下: [ {"deviceId":1,"userId":1}, {"deviceId":2,"userId":1}, {"deviceId":3,"userId":2}, {"deviceId":4,"userId":2

我有一个问题,希望有人能帮助我提高Java流API的知识

我的服务通过RabbitMQ接收来自另一个服务的数据,其数组如下:

[ {"deviceId":1,"userId":1},
{"deviceId":2,"userId":1},
{"deviceId":3,"userId":2},
{"deviceId":4,"userId":2},
{"deviceId":5,"userId":1},
{"deviceId":6,"userId":2},
... ]
我需要对这些数据做的是将其收集到用户有userId的列表和deviceId的列表中。因此,根据上述数据,应为:

User {userId: 1, List<deviceId>: 1,2,5} & User {userId: 2, List<deviceId>: 3,4,6}
User{userId:1,List:1,2,5}&User{userId:2,List:3,4,6}
我确实有一个可行的解决方案,但它很笨拙&我相信用javastreamapi可以做得更好

解决办法是:

    private List<User> parseDeviceData(JsonNode jsonNode) {
    List<JsonNode> list = StreamSupport.stream(jsonNode.spliterator(), false)
            .filter(this::validDeviceRecord) // checking for presence of deviceId & userId
            .collect(Collectors.toList());

    Map<Integer, ArrayList<Integer>> map = new HashMap<>();
    for (JsonNode j : list) {
        Integer id = j.get("deviceId").asInt();
        Integer userId = j.get("userId").asInt();
        ArrayList<Integer> l;
        if (map.containsKey(userId)) {
            l = map.get(userId);
        } else {
            l = new ArrayList<>();
        }
        l.add(id);
        map.put(userId, l);
    }

    return map.entrySet().parallelStream()
            .map(entry -> new User(entry.getKey(), entry.getValue()))
            .collect(Collectors.toList());
}
私有列表parseDeviceData(JsonNode JsonNode){
List List=StreamSupport.stream(jsonNode.spliterator(),false)
.filter(this::validDeviceRecord)//检查是否存在设备ID和用户ID
.collect(Collectors.toList());
Map Map=newhashmap();
for(JsonNode j:list){
整数id=j.get(“设备id”).asInt();
整数userId=j.get(“userId”).asInt();
ArrayList l;
if(map.containsKey(userId)){
l=map.get(userId);
}否则{
l=新的ArrayList();
}
l、 添加(id);
map.put(userId,l);
}
返回map.entrySet().parallelStream()
.map(条目->新用户(entry.getKey(),entry.getValue())
.collect(Collectors.toList());
}

我怎么能对streams做同样的事情呢?谢谢

您可以制作以下代码作为示例

List<MyObject> list = new ArrayList<>();
        list.add(new MyObject("1", "1"));
        list.add(new MyObject("2", "2"));
        list.add(new MyObject("3", "1"));
        list.add(new MyObject("4", "2"));
        list.add(new MyObject("5", "3"));
        list.add(new MyObject("6", "1"));
        Map<String, List<String>> items = list.stream().collect(Collectors.groupingBy(MyObject::getUserId, Collectors.mapping(MyObject::getDeviceId,Collectors.toList())));
        System.out.println(items);
List List=new ArrayList();
添加(新的MyObject(“1”、“1”));
添加(新的MyObject(“2”、“2”));
添加(新的MyObject(“3”、“1”));
添加(新的MyObject(“4”、“2”));
添加(新的MyObject(“5”、“3”));
添加(新的MyObject(“6”、“1”));
Map items=list.stream().collect(Collectors.groupingBy(MyObject::getUserId,Collectors.mapping(MyObject::getDeviceId,Collectors.toList());
系统输出打印项次(项);

(第二个答案似乎就是您要找的)