小编Vla*_*nev的帖子

如何组合3个或更多CompletionStages?

如果有2个CompletionStages,我可以将它们与thenCombine方法结合起来:

CompletionStage<A> aCompletionStage = getA();
CompletionStage<B> bCompletionStage = getB();
CompletionStage<Combined> combinedCompletionStage =
    aCompletionStage.thenCombine(bCompletionStage, (aData, bData) -> combine(aData, bData));
Run Code Online (Sandbox Code Playgroud)

如果我有3个或更多CompletionStages,我可以创建一个thenCombine方法链,但我必须使用临时对象来传递结果.例如,以下是使用PairTripleorg.apache.commons.lang3.tuple包中获得的解决方案:

CompletionStage<A> aCompletionStage = getA();
CompletionStage<B> bCompletionStage = getB();
CompletionStage<C> cCompletionStage = getC();
CompletionStage<D> dCompletionStage = getD();

CompletionStage<Combined> combinedDataCompletionStage =
        aCompletionStage.thenCombine(bCompletionStage, (Pair::of))
                .thenCombine(cCompletionStage, (ab, c) ->
                        Triple.of(ab.getLeft(), ab.getRight(), c))
                .thenCombine(dCompletionStage, (abc, d) ->
                        combine(abc.getLeft(), abc.getMiddle(), abc.getRight(), d));
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来组合多个CompletionStages的结果?

java concurrency java-8

19
推荐指数
4
解决办法
1万
查看次数

Spring Boot异常处理最佳实践

我有一个关于异常处理的简单问题。我目前有一个应用程序分为多个层:控制器、服务、存储库,我的问题如下:异常处理应该由控制器还是服务来完成?

例子:

控制器:

@PostMapping(value = "/{id}/parents", produces = "application/json; charset=utf-8")
public ResponseEntity<AccommodationRequestDTO> resident(@PathVariable Long id, @Valid @RequestBody ParentsAndUrgencyContactDTO parentsAndUrgencyContactDTO) {
    AccommodationRequestDTO saved;
    try {
        saved = this.service.parents(id, parentsAndUrgencyContactDTO);
    } catch (Exception e) {
        throw new ResponseStatusException(
                HttpStatus.INTERNAL_SERVER_ERROR,
                "Failed to save request", e);
    }
    return ResponseEntity.ok(saved);
}
Run Code Online (Sandbox Code Playgroud)

服务:

public AccommodationRequestDTO parents(Long id, ParentsAndUrgencyContactDTO parentsAndUrgencyContactDTO) {
    Optional<AccommodationRequest> accommodationRequest = repository.findById(id);

    if (accommodationRequest.isPresent()) {
        AccommodationRequest saved = accommodationRequest.get();
        Parent firstParent = parentMapper.toEntity(parentsAndUrgencyContactDTO.getFirstParent());
        Parent secondParent = parentMapper.toEntity(parentsAndUrgencyContactDTO.getSecondParent());

        firstParent = parentRepository.save(firstParent);
        secondParent = parentRepository.save(secondParent);

        saved.setFirstParent(firstParent); …
Run Code Online (Sandbox Code Playgroud)

spring spring-boot

5
推荐指数
2
解决办法
2万
查看次数

Scala:集合的类型参数

我有一个函数将包含空序列的选项转换为None:

def emptyToNone[A](seqOpt: Option[Seq[A]]): Option[Seq[A]] = seqOpt match {
  case Some(Seq()) => None
  case _ => seqOpt
}
Run Code Online (Sandbox Code Playgroud)

我想通过用类型参数替换Seq来使它更通用,因此它可以与其他Scala集合一起使用.

我能够这样做:

def emptyToNone[C[A] <: Traversable[A], A](seqOpt: Option[C[A]]): Option[C[A]] = seqOpt match {
  case Some(s) if s.isEmpty => None
  case _ => seqOpt
}
Run Code Online (Sandbox Code Playgroud)

但是我必须使用2种类型的参数,C和A.我可以在这里简化函数签名吗?

scala higher-kinded-types

0
推荐指数
1
解决办法
68
查看次数