链接可选orElseThrow

dav*_*ooh 6 java functional-programming optional

我有一段这样的代码:

return getObject()
    .map(obj -> obj.getNullableField())
    .orElseThrow(() -> new IllegalStateException("Object not found!"));
Run Code Online (Sandbox Code Playgroud)

目前,当给定Object的不存在时,我会抛出异常.

现在我还需要检查nullableFieldObject存在.

一个明显的解决方案可能是这样的:

var fieldVal = getObject()
    .map(obj -> obj.getNullableField())
    .orElseThrow(() -> new IllegalStateException("Object not found!"));

  return Optional.ofNullable(fieldVal)
     .orElseThrow(() -> new IllegalStateException("Field is not present"));
Run Code Online (Sandbox Code Playgroud)

但是我想在同一个功能链中实现它......

我错过了什么?

Yas*_*jaj 8

它可以直接在同一个链中实现,你会得到不同的异常抛出.现在,它的可读性低于你的第一个解决方案,所以你需要权衡.

return getObject().map(obj -> Optional.ofNullable(obj.getNullableField())
                                      .orElseThrow(() -> new IllegalStateException("Field is not present")))
                  .orElseThrow(() -> new IllegalStateException("Object not found!"));
Run Code Online (Sandbox Code Playgroud)

  • 我建议不要使用嵌套(并且通常使用)选项,可读性会被宰杀,但无论如何还是很好的答案;) (4认同)