【问题标题】:How to collect data to Map<Integer, List<Integer> using Java Stream API? [duplicate]如何使用 Java Stream API 将数据收集到 Map<Integer, List<Integer>? [复制]
【发布时间】: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


【解决方案1】:

您可以将以下代码作为示例。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-05
    • 2014-05-04
    • 2019-04-19
    • 2023-03-26
    • 1970-01-01
    • 2021-05-22
    • 2022-09-30
    • 1970-01-01
    相关资源
    最近更新 更多