合并两个流并调用方法

Combine two streams and call method

我在如何异步流式传输和调用方法时遇到问题, 例如

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
}

如何实现该结果?

假设您要从两个单独的 usersworkplaces 流创建 (user, workplace) 对,此操作通常称为“压缩”。

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 流,带有 i 索引的简单 for 循环可能更容易。

您描述的是压缩操作。

如果使用 Google 番石榴,你可以这样做来组合它们:

Streams.zip(users.stream(), workplaces.stream(), (user, workplace) -> mapping(user, workplace, someType))

您还可以找到描述此操作的其他一些实现 here