如何将单个元素列表转换为java 8可选

Mar*_*szS 15 java collections optional java-8

如何很好地将包含一个或零个元素的列表转换为Optional?

丑陋的代码:

List<Integer> integers = new ArrayList<>();

Optional<Integer> optional = integers.size() == 0 ?
        Optional.empty() :
        Optional.of(integers.get(0));
Run Code Online (Sandbox Code Playgroud)

Kon*_*kov 24

您可以使用以下Stream#findFirst()方法:

返回描述此流的第一个元素的Optional,如果流为空,则返回空Optional.

List<Integer> list = ...
Optional<Integer> optional = list.stream().findFirst();
Run Code Online (Sandbox Code Playgroud)

或者,同样的成功,您也可以使用该Stream#findAny()方法.

  • 注意轻微的语义差异:问题的代码使用`ofNullable`,这意味着如果列表非空但在第一个地方包含"null",则返回空的`Optional`.相比之下,`Stream.findFirst()`如果元素存在则抛出异常,但是`null`. (7认同)