如何收集地图数据<;整数,列表<;整数>;使用Java流API?
我有一个问题,希望有人能帮助我提高Java流API的知识 我的服务通过RabbitMQ接收来自另一个服务的数据,其数组如下:如何收集地图数据<;整数,列表<;整数>;使用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
[ {"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());
系统输出打印项次(项);
(第二个答案似乎就是您要找的)