При использовании нового Java8 streams api для поиска одного конкретного элемента в коллекции я пишу такой код:
String theFirstString = myCollection.stream()
.findFirst()
.get();
Здесь IntelliJ предупреждает, что get () вызывается без предварительной проверки isPresent ().
Тем не менее, этот код:
String theFirstString = myCollection.iterator().next();
... не дает предупреждения.
Есть ли какое-то глубокое различие между этими двумя методами, которое делает потоковый подход более «опасным» в некотором смысле, что крайне важно никогда не вызывать get () без вызова isPresent () в первую очередь? Поглядывая вокруг, я нахожу статьи, рассказывающие о том, как программисты небрежны с Optional <>, и предполагаю, что они могут вызывать get () всякий раз, когда.
Дело в том, что я хотел бы, чтобы на меня было сгенерировано исключение как можно ближе к месту, где мой код содержит ошибки, что в этом случае будет тем, где я вызываю get (), когда нет элемента, который нужно найти. Я не хочу писать бесполезные эссе, такие как:
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();
... разве есть опасность провоцировать исключения из get (), о которых я не знаю?
Прочитав ответ Карла Билефельда и комментарий Халка, я понял, что мой код исключения был немного неуклюжим, вот что-то лучше:
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));
Это выглядит более полезным и, вероятно, станет естественным во многих местах. Я все еще чувствую, что хочу иметь возможность выбирать один элемент из списка, не имея дело со всем этим, но это может быть просто потому, что мне нужно привыкнуть к такого рода конструкциям.