当使用新的Java8流api在集合中查找一个特定元素时,我编写如下代码:
String theFirstString = myCollection.stream()
.findFirst()
.get();
此处IntelliJ警告说,在不首先检查isPresent()的情况下调用get()的情况。
但是,此代码:
String theFirstString = myCollection.iterator().next();
...没有警告。
两种技术之间是否存在深刻的区别,从而使流传输方法在某种程度上更加“危险”,所以在不首先调用isPresent()的情况下永远不要调用get()至关重要。到处搜寻,我发现一些文章谈论程序员对Optional <>粗心大意,并假定他们可以随时调用get()。
问题是,我想在我的代码有错误的地方尽可能近地引发异常,在这种情况下,这是我在找不到元素时调用get()的地方。我不想写无用的文章,例如:
Optional<String> firstStream = myCollection.stream()
.findFirst();
if (!firstStream.isPresent()) {
throw new IllegalStateException("There is no first string even though I totally expected there to be! <sarcasm>This exception is much more useful than NoSuchElementException</sarcasm>");
}
String theFirstString = firstStream.get();
...除非我不知道从get()引发异常有某种危险?
阅读了Karl Bielefeldt的回复和Hulk的评论后,我意识到上面的异常代码有点笨拙,这是更好的东西:
String errorString = "There is no first string even though I totally expected there to be! <sarcasm>This exception is much more useful than NoSuchElementException</sarcasm>";
String firstString = myCollection.stream()
.findFirst()
.orElseThrow(() -> new IllegalStateException(errorString));
这看起来更有用,并且在许多地方可能很自然。我仍然觉得我将希望能够从列表中选择一个元素而不必处理所有这些问题,但这可能只是我需要习惯于此类构造。