Потоки Java 8: объедините свойства двух объектов, находящихся в ArrayLists, в ArrayList третьего типа объектов - PullRequest
0 голосов
/ 20 сентября 2018

Я новичок в потоках Java 8 и буду признателен за помощь в обучении.

У меня есть Arraylist объектов User и Arraylist объектов UserCompany.У объекта User есть user_id и связанная с ним информация о пользователях. В списке UserCompany есть объект Company пользователя, но есть только user_id пользователя.Я хотел бы создать третий объект с именем UserCompanyView, который представляет собой комбинацию объекта User и объекта Company с использованием потоков Java 8.Мне удалось найти только примеры объединения или объединения двух массивов, например:

 Stream.of(list1, list2)
.flatMap(x -> x.stream())
.collect(Collectors.toList());

, но ничего, кроме того, что конкретные свойства отдельных списков используются для создания третьего объекта.

код должен:

1) выполнять итерацию по списку UserCompany

2) Проверять, совпадает ли userCid user_id со списком пользователей user_id

3), если2 - правда, создайте объект UserCompanyView, используя User и UserCompany

4) Добавьте UserCompanyView из 3 в новый список и верните его.

Спасибо за просмотр этого поста и за то, что нашли время ответить

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Если они не следуют одному и тому же порядку, вам нужно сначала создать карту идентификаторов:

Map<Integer, User> usersById = users.stream()
        .collect(Collectors.toMap(User::getUserId, u -> u));

Теперь вы можете передавать другой список в потоковом режиме и сопоставлять каждому элементу соответствующий ему Userпо идентификатору:

List<UserCompanyView> views = userCompanies.stream()
        .map(uc -> new UserCompanyView(usersById.get(uc.getUserId()), uc))
        .collect(Collectors.toList())

Если есть UserCompany s, не соответствующие User s, вы можете отфильтровать их, добавив это перед map():

.filter(uc -> usersById.containsKey(uc.getUserId()))
0 голосов
/ 20 сентября 2018

Для того, чтобы он заработал, вы начинаете с создания объекта Map из user_id до User.

Используя потоки, вы сделаете это так:

List<User> users = // built elsewhere

Map<Integer, User> userById = users.stream()
        .collect(Collectors.toMap(User::getUserId, u -> u));

Затем вы перебираете и UserCompany объекты, ищите объект User и создаете объект UserCompanyView, добавляя их к List.

Используя потоки, вы сделаете этокак это:

List<UserCompany> userCompanies = // built elsewhere

List<UserCompanyView> views = userCompanies.stream()
        .map(uc -> new UserCompanyView(userById.get(uc.getUserId()), uc))
        .collect(Collectors.toList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...