如何在同一行上使用map和orElseThrow?

时间:2018-04-20 01:45:23

标签: java spring spring-mvc spring-boot

我想从Optional对象构造一个对象,如果Optional对象不存在则抛出异常。

@GetMapping("/{productId}")
    public ProductResponse getOneProduct(@PathVariable Long productId) {
        Optional<Product> foundProductOpt = productRepository.findById(productId);
        return foundProductOpt.map(() ->
               new ProductResponse(product, "ok").orElseThrow(() ->
                       new EntityNotFoundException("Product with id " +
                                                   productId + "was not found"));
    }

谷歌上搜索似乎我不能以这种方式使用map方法,我希望找到一个使用findById的Product然后将它放入一个foundProductOpt变量然后用找到的Product实例化一个响应对象以及一条消息随之而来。

如何将对象从Optional传递给方法或构造函数,或者如果对象不存在则抛出异常?

2 个答案:

答案 0 :(得分:2)

您应该更改此行:

return foundProductOpt
    .map(() -> new ProductResponse(product, "ok")
    .orElseThrow(() -> new EntityNotFoundException(
        "Product with id " + productId + "was not found"));

要:

return foundProductOpt
    .map(p -> new ProductResponse(p, "ok"))
    .orElseThrow(() -> new EntityNotFoundException(
        "Product with id " + productId + "was not found"));

格式化这样的长行正确地提高了可读性。此外,您没有正确使用Optional.mapOptional.orElseThrow

答案 1 :(得分:1)

您不需要映射任何内容。如果不存在就扔掉。以下是我的思考方式:

首先假装Optional是一个真实对象,一切正常。

"..."

然后使用cmd.exe转换可选项。

return new ProductResponse(foundProductOpt
                           , "ok");