Quando si utilizzano le nuove API Java8 stream per trovare un elemento specifico in una raccolta, scrivo codice in questo modo:
String theFirstString = myCollection.stream()
.findFirst()
.get();
Qui IntelliJ avverte che get () viene chiamato senza prima controllare isPresent ().
Tuttavia, questo codice:
String theFirstString = myCollection.iterator().next();
... non dà alcun avvertimento.
C'è qualche profonda differenza tra le due tecniche, che rende l'approccio di streaming più "pericoloso" in qualche modo, che è fondamentale non chiamare mai get () senza prima chiamare isPresent ()? Cercando su Internet, trovo articoli che parlano di come i programmatori sono incuranti con Optional <> e presumo che possano chiamare get () ogni volta.
Il fatto è che mi piace ricevere un'eccezione il più vicino possibile al luogo in cui il mio codice è difettoso, che in questo caso sarebbe dove chiamo get () quando non è stato trovato alcun elemento. Non voglio scrivere saggi inutili come:
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();
... a meno che non ci sia qualche pericolo nel provocare eccezioni da get () di cui non sono a conoscenza?
Dopo aver letto la risposta di Karl Bielefeldt e un commento di Hulk, mi sono reso conto che il mio codice di eccezione sopra era un po 'goffo, ecco qualcosa di meglio:
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));
Sembra più utile e probabilmente diventerà naturale in molti luoghi. Mi sento ancora come se volessi essere in grado di scegliere un elemento da un elenco senza dover affrontare tutto questo, ma potrebbe essere solo che mi devo abituare a questi tipi di costrutti.