Как создать список различных объектов, используя список различных объектов, имеющих свойства, используя потоки java - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть проблема algorythmi c с созданием чего-то логического для набора данных, подобного этому:

|-------|--------|
|  id   | ctx_id |
|-------|--------|
|   1   |  1001  |
|   1   |  1002  |
|   1   |  1003  |
|   1   |  1004  |
|   2   |  2001  |
|   2   |  2002  |
|   2   |  2003  |
------------------

Это список, который я получаю из базы данных, как объект List<UsersContexts>, содержащий id и ctx_id. Чего я хочу добиться, так это создать два объекта такой сущности:

private class UserData {
    private long id;
    private List<long> contextList;
}

У каждого пользователя есть идентификатор и назначенные ему контексты. Чего я хочу добиться, так это манипулировать данными в таблице выше, чтобы я мог создать два объекта UserData, один из которых содержит id = 1 и список, содержащий 1001, 1002, 1003, 1004, и второй объект UserData, содержащий id = 2 и список, содержащий 2001, 2002, 2003.

Как мне этого добиться? Я пытался использовать filter() на stream() на этом List<UsersContexts> объекте, но без усилий ...

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Первым шагом является сбор UsersContexts в Map<Integer, List<Integer>> с использованием Collectors.groupingBy с группировкой по id. А затем передайте эту карту в поток и преобразуйте каждую запись в UserData

    usersContexts.stream()
                 .collect(Collectors.groupingBy(UsersContexts::getId, 
                         Collectors.mapping(UsersContexts::getCxtId, Collectors.toList())))
                 .entrySet()
                 .stream()
                 .map(entry->new UserData(entry.getKey(), entry.getValue()))
                 .collect(Collectors.toList());
0 голосов
/ 01 апреля 2020

Вы можете использовать функцию map() и toMap() коллекторы с функцией слияния.

Collectio<UserData> usersData = usersContexts.stream()
      .map(u -> new UserData(u.getId(), new ArrayList<>(singletonList(u.getCtx_id()))))
      .collect(Collectors.toMap(UserData::getId, Function.identity(),
                 (o, o2) -> { o.getContextList().addAll(o2.getContextList());return o; }))
      .values();
...