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

jtw3ybtb  于 2022-11-28  发布在  Spring
关注(0)|答案(2)|浏览(167)

我想从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找到一个产品,然后将其放入一个foundProductOpt变量中,然后用找到的产品和一条消息示例化一个响应对象。
如何将对象从Optional传递到方法或构造函数中,或者在对象不存在时抛出异常?

u5rb5r59

u5rb5r591#

您应该更改此行:

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

t5fffqht

t5fffqht2#

你不需要Map任何东西。如果不存在就抛出。下面是我的想法:
首先假设Optional是一真实的对象,一切正常。

return new ProductResponse(foundProductOpt
                           , "ok");

然后使用orElseThrow()转换可选。

return new ProductResponse(foundProductOpt // Unchanged
        .orElseThrow(() -> new EntityNotFoundException("Not found"))
                           , "ok"); // Unchanged

相关问题