【问题标题】:My simple project BiFunction problem Java [duplicate]我的简单项目 BiFunction 问题 Java [重复]
【发布时间】:2025-11-30 12:40:02
【问题描述】:

大家好,我怎样才能在 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();
}

【问题讨论】:

  • BiFunction 接受 2 个 (Bi) 参数。你需要编写自己的 try 函数接口,R apply(T t, U u, V v);
  • 没有尼古拉斯不要我的问题
  • 其实我的问题是 r2dbc 连接表,一个星期我找不到如何打印它,你有什么可以推荐给我的吗?
  • 如果你能帮助我,我会很高兴
  • 是的,我建议您让您的问题易于理解。

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


【解决方案1】:

如何在 Bifunction 中使用超过 3 个参数?

你不能。 Bifunction 特别接受两个参数,并返回一个值。这永远不会改变。

但是,我认为您实际上在这里问的是如何将两个以上的 Flux 发布者压缩成一个自定义类型,而 corresponding zip method 只需要两个发布者,然后 BiFunction 将它们合并。

对于两个以上的发布者,我们有一个further overload of zip,它允许您指定任意数量的发布者,以及一个将它们组合成一个集合类型的组合器。该函数采用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); 之类的内容。

【讨论】:

    最近更新 更多