Quando si utilizza la nuova API di Java8 stream per trovare un elemento specifico in una raccolta, scrivo un codice come questo:
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 fornisce alcun avviso.
C'è una profonda differenza tra le due tecniche, che rende l'approccio allo streaming più "pericoloso" in qualche modo, che è fondamentale non chiamare mai get () senza chiamare isPresent () prima? Cercando su Google, trovo articoli che parlano di come i programmatori sono negligenti con Optional < > e supponiamo di poter chiamare get () ogni volta.
Il fatto è che mi piace ottenere un'eccezione il più vicino possibile al luogo in cui il mio codice è bacato, che in questo caso sarebbe dove sto chiamando get () quando non c'è alcun elemento da trovare . 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 vi 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 verrà naturale in molti posti. Mi sento ancora come se volessi essere in grado di scegliere un elemento da una lista senza dover affrontare tutto questo, ma potrebbe essere solo che ho bisogno di abituarmi a questi tipi di costrutti.