避免使用Stream的NoSuchElementException

时间:2015-06-06 18:26:56

标签: java java-8 java-stream optional

我有以下Stream

Stream<T> stream = stream();

T result = stream.filter(t -> {
    double x = getX(t);
    double y = getY(t);
    return (x == tx && y == ty);
}).findFirst().get();

return result;

但是,并不总是有一个结果会给我以下错误:

  

NoSuchElementException:没有值

那么如果没有值,我怎么能返回null

2 个答案:

答案 0 :(得分:23)

Stream#findFirst()会返回Optional,它会特别存在,因此您无需对null值进行操作。

  

容器对象,可能包含也可能不包含非null值。如果一个   值已存在,isPresent()将返回trueget()将返回   价值。

否则,Optional#get()会抛出NoSuchElementException

  

如果此Optional中存在值,则返回该值,否则返回该值   抛出NoSuchElementException

Optional null永远不会公开其值isPresent()

如果您确实需要,请检查null并自行返回Stream<T> stream = stream(); Optional<T> result = stream.filter(t -> { double x = getX(t); double y = getY(t); return (x == tx && y == ty); }).findFirst(); if (result.isPresent()) return result.get(); return null;

see code in link

答案 1 :(得分:0)

替换Optional.get的替代方法(使用NoSuchElementException的用户意图很可能失败)是在JDK10中引入更详细的API,称为Optional.orElseThrow()。在author's words -

  

Optional.get()是一个“有吸引力的滋扰”,太诱人了   程序员,导致频繁的错误。 人们不期待吸气   抛出异常。 Optional.get()的替换API   应该添加等效的语义。

注意 : - 这两个API的底层实现是相同的,但后者更清楚地读出默认情况下如果值不是则抛出NoSuchElementException目前,它将消费者使用的现有Optional.orElseThrow​(Supplier<? extends X> exceptionSupplier)实现内联作为明确的替代。