У меня проблема, как асинхронно транслировать и вызывать метод, например
List<User> users = List.of(user1, user2, user3);
List<Workplace> worklpaces = List.of(workplace1,workplace2,workplace3)
Всегда одно и то же users.size == workplaces.size
у нас есть отображение функций
public List<UserWithWorkplace> combineUserWithWorkplaceAndType(List<User> users,List<Workplace>
worklpaces, Type someRandomtype) {
//here is the problem it wont it should be get
//List<UserWithWorkplace>.size == users.size == workplaces.size
return users.stream().flatMap(user ->
worklpaces.stream()
.map(worklpace -> mapping(user,worklpace, someRandomtype)))
.toList()
}
private UserWithWorkplace mapping( User user, Workplace workplace,Type someRandomtype){
//cominging and returning user with workplace
}
Как добиться такого результата?
Если вы хотите создать пары (user, workplace)
из двух отдельных потоков users
и workplaces
, эта операция обычно называется «сжатие».
Библиотека Guava предоставляет для этого метод Streams.zip(Stream, Steam, Function)
. В вашем случае код будет выглядеть так:
Stream<UserWithWorkplace> zipped = Streams.zip(
users.stream(),
worklpaces.stream(),
(u, w) -> this.mapping(u, w, someRandomtype));
Однако в вашем примере кода для представления данных используется List
, а не Stream
. Я не уверен, что вам нужно использовать потоки Java для этого, простой цикл for
с индексом i
может быть проще.
То, что вы описываете, является операцией ziping.
Если вы используете Google Guava, вы можете сделать это, чтобы объединить их:
Streams.zip(users.stream(), workplaces.stream(), (user, workplace) -> mapping(user, workplace, someType))
Вы также можете найти некоторые другие реализации этой операции, описанные здесь