如何从ifPresentOrElse语句中获取对象数据?

时间:2019-12-05 12:10:34

标签: java lambda optional

我正在尝试从对象获取一些数据。我有一小段代码,其中:

UserAccessValidator只是一个验证器,方法validateAccessToAccount接受一个Long,并且在未授予访问权限时抛出异常。就这么简单。

userAccessValidator.validateAccessToAccount(
    peripheralRepository.findById(peripheralId)
        .ifPresentOrElse(p -> p.getAccount().getId(),
            () -> {throw new NotFoundException(Peripheral.class);}));

它没有编译,我得到的信息是Long是必需的,但提供的是无效的。

如何修复这段代码使其正常工作?我想获得帐户ID,但我不知道该如何实现...非常详细的解释将不胜感激;)

1 个答案:

答案 0 :(得分:1)

ifPresentOrElse​()具有void返回类型,因此不适合返回值。

使用mapOptional内部的值映射到所需的帐户ID。这将返回另一个Optional

然后,您可以调用orElseThrow,如果Optional为空,则会抛出异常,如果不是,则返回存储在该Optional中的值。

userAccessValidator.validateAccessToAccount(
        peripheralRepository.findById(peripheralId)
                            .map(p -> p.getAccount().getId())
                            .orElseThrow​ (() -> {throw new NotFoundException(Peripheral.class);});