Ao usar a nova API Java de fluxos Java8 para encontrar um elemento específico em uma coleção, escrevo um código como este:
String theFirstString = myCollection.stream()
.findFirst()
.get();
Aqui, o IntelliJ avisa que get () é chamado sem verificar primeiro isPresent ().
No entanto, este código:
String theFirstString = myCollection.iterator().next();
... não dá aviso.
Existe alguma diferença profunda entre as duas técnicas, que torna a abordagem de streaming mais "perigosa" de alguma forma, que é crucial nunca chamar get () sem chamar isPresent () primeiro? Pesquisando no Google, encontro artigos falando sobre como os programadores são descuidados com o Opcional <> e presumo que eles possam chamar get () sempre.
O problema é que eu gosto de receber uma exceção o mais próximo possível do local onde meu código está com bugs, que nesse caso seria o local para onde estou chamando get () quando não há nenhum elemento a ser encontrado. Não quero escrever ensaios inúteis como:
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 menos que haja algum perigo em provocar exceções de get () das quais eu não conheço?
Depois de ler a resposta de Karl Bielefeldt e um comentário de Hulk, percebi que meu código de exceção acima era um pouco desajeitado, aqui está algo melhor:
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));
Isso parece mais útil e provavelmente virá natural em muitos lugares. Ainda sinto que desejo escolher um elemento de uma lista sem ter que lidar com tudo isso, mas pode ser que eu precise me acostumar com esses tipos de construções.