【发布时间】:2021-01-22 12:23:36
【问题描述】:
我有一个问题,希望有人能帮助我提高对 Java Stream 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}
我确实有一个可行的解决方案,但它很笨拙,我相信使用 Java Stream API 可以做得更好。
解决办法是:
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());
}
我怎样才能对流做同样的事情?谢谢!
【问题讨论】:
-
(第二个答案似乎就是你要找的)
标签: java java-stream