我有以下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
?
答案 0 :(得分:23)
Stream#findFirst()
会返回Optional
,它会特别存在,因此您无需对null
值进行操作。
容器对象,可能包含也可能不包含非null值。如果一个 值已存在,
isPresent()
将返回true
,get()
将返回 价值。
否则,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)
实现内联作为明确的替代。