2015-06-06 100 views
26

我有以下Stream與流避免NoSuchElementException異常

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: No value present

所以,我怎麼可以返回null如果目前沒有價值?

回答

49

您可以使用Optional.orElse,它比檢查isPresent簡單得多:

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

return result; 
17

Stream#findFirst()返回一個Optional,它專門存在以便您不需要操作null值。

A container object which may or may not contain a non-null value. If a value is present, isPresent() will return true and get() will return the value.

否則,Optional#get()拋出一個NoSuchElementException。如果是null

If a value is present in this Optional , returns the value, otherwise throws NoSuchElementException .

Optional永遠不會暴露其價值。

如果您確實需要,只需查看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; 
+0

或者直接返回'Optional',這可能比返回null有一些優點。 – Zhedar

1

更換Optional.get(其中較有可能有一個NoSuchElementException失敗,用戶的意圖)的另一種方法是用在JDK10中引入了更爲詳細的API,稱爲Optional.orElseThrow()。在author's words -

Optional.get() is an "attractive nuisance" and is too tempting for programmers, leading to frequent errors. People don't expect a getter to throw an exception. A replacement API for Optional.get() with equivalent semantics should be added.

: - 無論這些API的底層實現是一樣的,但後者讀出更加清楚地表明一個NoSuchElementException默認會被拋出,如果該值沒有出現,這內聯到消費者使用現有的Optional.orElseThrow​(Supplier<? extends X> exceptionSupplier)作爲明確的替代方案。

+0

更準確地說,如果沒有'isPresent()'檢查] ['Optional.get()'](https://stackoverflow.com/questions/38725445/optional-get-without-ispresent-check)標記爲此線程的重複。 – nullpointer