开发者社区> 问答> 正文

流畅地链接多个方法,类似于Stream,而无需Optional类型的冗长性

在Spring应用程序中,我倾向于将请求主体放在控制器方法中,并希望通过多个方法调用(沿途返回不同类型)来流畅地传递请求主体,例如以下(简化的)示例:

public ResponseEntity<FooDto> postFoo(@RequestBody final FooDto requestBody) {
  return Optional.of(requestBody) // Optional<FooDto>
      .map(mapper::fromDto) // Optional<FooEntity>
      .map(service::insertEntity) // Optional<FooEntity>
      .map(mapper::fromEntity) // Optional<FooDto>
      .map(dto -> ResponseEntity.created(/* ... */).body(dto).build()) // Optional<ResponseEntity<FooDto>>
      .orElseThrow(IllegalStateException::new);
}

如您所见,我很想应用某些FP模式,但是Optional类并不真正适合这样做,因为隐含的“可选性”是人为的,并且感兴趣的基础对象永远不应为空。因此,不会(希望)抛出最终异常,Optional::get或者,因为Sonarlint抱怨未检查的get调用是正确的,所以仅调用不是一个好选择。

是否有任何惯用的方法,甚至与vavr或其他FP库结合使用,也可以比这种人为的Optional构造更好地表达这种方法链?否则,我可能不得不避免这样做,并返回到具有许多变量的经典命令式方法。

编辑:如果尝试使用返回的方法,那么我尝试使用Optional的方式很容易失控,Either<ErrorReason, Optional >这使得Optional<Either<ErrorReason, Optional >>结束不再清晰。

问题来源:Stack Overflow

展开
收起
montos 2020-03-25 22:00:48 708 0
1 条回答
写回答
取消 提交回答
  • 执行您要寻找的内容的最干净的方法是恢复命令式风格,例如:

    public ResponseEntity<FooDto> postFoo(final FooDto requestBody) {
        final FooEntity fooEntity = fromDto(requestBody);
        final FooEntity updatedEntity = insertEntity(fooEntity); // should be void?
        final FooDto responseDto = fromEntity(updatedEntity);
        return ResponseEntity.created(/* ... */)
                .body(responseDto)
                .build();
    }
    

    回答来源:Stack Overflow

    2020-03-25 22:01:33
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载

相关实验场景

更多