Bir koleksiyondaki belirli bir öğeyi bulmak için yeni Java8 akışlarını api kullanırken, şöyle kod yazarım:
String theFirstString = myCollection.stream()
.findFirst()
.get();
Burada IntelliJ, önce isPresent () öğesini kontrol etmeden get () işlevinin çağrıldığını uyarır.
Ancak bu kod:
String theFirstString = myCollection.iterator().next();
... uyarı vermez.
İki teknik arasında, akış yaklaşımını bir şekilde daha "tehlikeli" yapan, ilk önce isPresent () işlevini çağırmadan get () işlevinin asla çağrılmaması çok önemlidir. Çevrenizdeyken, programcıların İsteğe bağlı <> ile nasıl dikkatsiz olduklarından bahseden makaleler bulurum ve ne zaman istediklerini get () olarak adlandırabilirler.
Sorun şu ki, kodumun arabası olduğu yere mümkün olduğunca yakın bir yere atılmayı seviyorum, bu durumda, bulunacak bir öğe olmadığında get () olarak çağırdığım yerde olur. Gibi işe yaramaz denemeler yazmak istemiyorum:
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();
... habersiz olduğum () dan istisnaları kışkırtma tehlikesi olmadığı sürece?
Karl Bielefeldt'in yanıtını ve Hulk'un yorumunu okuduktan sonra yukarıdaki istisna kodumun biraz sakar olduğunu farkettim, işte daha iyi bir şey:
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));
Bu daha kullanışlı görünüyor ve birçok yerde muhtemelen doğal olacak. Hala bunlarla uğraşmak zorunda kalmadan bir listeden bir öğe seçmek isteyeceğimi hissediyorum, ancak bu tür yapılara alışmam gerekebilir.