新しいJava8ストリームAPIを使用してコレクション内の特定の要素を検索する場合、次のようなコードを記述します。
String theFirstString = myCollection.stream()
.findFirst()
.get();
ここで、IntelliJは、isPresent()を最初にチェックせずにget()が呼び出されることを警告しています。
ただし、このコード:
String theFirstString = myCollection.iterator().next();
...警告は表示されません。
ストリーミングアプローチを何らかの方法でより「危険」にし、最初にisPresent()を呼び出さずにget()を呼び出さないことが重要であるという2つの手法の間に大きな違いがありますか?いろいろと調べてみると、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));
これはより便利に見え、おそらく多くの場所で自然になります。このすべてに対処することなく、リストから1つの要素を選択できるようになりたいと思っていますが、それはこれらの種類の構造に慣れる必要があるということです。