Korzystając z nowego interfejsu API strumieni Java8 w celu znalezienia jednego konkretnego elementu w kolekcji, piszę taki kod:
String theFirstString = myCollection.stream()
.findFirst()
.get();
Tutaj IntelliJ ostrzega, że wywoływana jest metoda get () bez uprzedniego sprawdzenia isPresent ().
Jednak ten kod:
String theFirstString = myCollection.iterator().next();
... nie daje ostrzeżenia.
Czy istnieje jakaś głęboka różnica między tymi dwiema technikami, która sprawia, że podejście do przesyłania strumieniowego jest w pewnym sensie „niebezpieczne”, dlatego tak ważne jest, aby nigdy nie wywoływać get () bez wywołania najpierw isPresent ()? Przeglądając go, znajduję artykuły mówiące o tym, jak programiści są nieostrożni z Opcjonalnym <> i zakładam, że mogą wywoływać get () za każdym razem.
Chodzi mi o to, że lubię rzucać na mnie wyjątkami jak najbliżej miejsca, w którym mój kod jest błędny, co w tym przypadku byłoby wywołaniem get (), gdy nie ma elementu do znalezienia. Nie chcę pisać bezużytecznych esejów, takich jak:
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();
... chyba że istnieje jakieś niebezpieczeństwo w prowokowaniu wyjątków od get (), których nie jestem świadomy?
Po przeczytaniu odpowiedzi Karla Bielefeldta i komentarza Hulka, zdałem sobie sprawę, że mój powyższy kod wyjątku był nieco niezdarny, oto coś lepszego:
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));
Wygląda to bardziej przydatne i prawdopodobnie stanie się naturalne w wielu miejscach. Nadal mam wrażenie, że będę mógł wybrać jeden element z listy bez konieczności zajmowania się tym wszystkim, ale może to być po prostu konieczność przyzwyczajenia się do tego rodzaju konstrukcji.