大家好 如何在 Bifunction 中使用 3 个以上的参数?所以我会同时使用标签和项目
public Flux<TaskDto> findAll() {
Flux<Task> taskFlux = tasksRepository.findAll();
Flux<Due> dueFlux = dueRepository.findAll();
Flux<Project> projectFlux = projectRepository.findAll();
return Flux.zip(taskFlux,dueFlux,taskDueTaskDtoBiFunction);
}
private final BiFunction<Task,Due,TaskDto> taskDueTaskDtoBiFunction = (x1, x2) -> TaskDto.builder()
.id(x1.getId())
.url(x1.getUrl())
.content(x1.getUrl())
.orderdata(x1.getOrderdata())
.completed(x1.getCompleted())
.comment_count(x1.getComment_count())
.priority(x1.getPriority())
.due(Due.builder().recurring(x2.getRecurring()).my_data(x2.getMy_data()).my_string(x2.getMy_string()).id(x2.getId()).build())
.build();
}
答案 0 :(得分:1)
如何在 Bifunction 中使用 3 个以上的参数?
你不能。 Bifunction 专门接受两个参数,并返回一个值。这永远不会改变。
但是,我认为您实际上在这里问的是如何将两个以上的 Flux
发布者压缩到一个自定义类型中,当 {{3} } 只需要两个发布者,然后用一个 BiFunction
来组合它们。
对于两个以上的发布者,我们有一个 corresponding zip method 允许您指定任意数量的发布者,以及一个组合器将它们组合成一个集合类型。该函数需要一个 Object[]
,然后您将其转换为相应的元素,因此在您的情况下,它将类似于:
private final Function<Object[],TaskDto> function = (Object[] arr) -> TaskDto.builder()
.id(((Task)arr[0]).getId())
.url(((Task)arr[0]).getUrl())
.content(((Task)arr[0]).getUrl())
.orderdata(((Task)arr[0]).getOrderdata())
.completed(((Task)arr[0]).getCompleted())
.comment_count(((Task)arr[0]).getComment_count())
.priority(((Task)arr[0]).getPriority())
.due(Due.builder().recurring(((Due)arr[1]).getRecurring()).my_data(((Due)arr[1]).getMy_data()).my_string(((Due)arr[1]).getMy_string()).id(((Due)arr[1]).getId()).build())
.build();
请注意,此 zip 重载使用可变参数,因此需要首先指定函数参数,因此您的 return 语句随后更改为类似 return Flux.zip(function,taskFlux,dueFlux);
的内容。