我的简单项目 BiFunction 问题 Java

时间:2021-03-26 12:08:58

标签: spring-boot spring-webflux spring-data-r2dbc

大家好 如何在 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();
}

1 个答案:

答案 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); 的内容。

相关问题