Во-первых, важно признать, что весь смысл наличия необязательной переменной состоит в том, чтобы избавиться от наличия нулей и, следовательно, от необходимости проверять наличие нулей. В конце концов, если вам нужно проверять переменную Optional на null каждый раз, когда она используется, то довольно бессмысленно иметь / использовать Optional во-первых.
Другими словами, переменная Optional никогда не должна иметь значение null, т. Е. Никогда не должна инициализироваться нулем, ей никогда не должно присваиваться значение null, и любые / все методы, которые возвращают значение Optional, никогда не должны возвращать null. , Во всех этих случаях следует использовать Optional.empty ().
Таким образом, выполняя этот контракт, Optional заставляет вас всегда явно обрабатывать случай, когда данные отсутствуют, и не нужно беспокоиться об исключениях NullPointerException.
Если вы привыкаете к Optionals, то я бы рекомендовал не использовать Strings, а вместо этого создавать свои собственные классы (Optional<Employee>
и т. Д.) С помощью «getters», которые бы вызывали NPE, если они вызваны на нуль. Согласно вашему примеру, со строками слишком просто не вызывать методы для них, и поэтому не испытывает боли, вызвавшей появление Optional.
Почему я не могу сделать это несколько опционально (null, null);
Конечно, язык позволяет вам делать это, хотя он нарушает неявный контракт, который я только что сказал о Optional выше. Непосредственный результат разрыва этого контракта заключается в том, что вы получите NullPointerException при вызове ifPresent
.
Как правильно вызывать метод MultiOptional?
Используя «Необязательно»! Двумя наиболее распространенными источниками Optionals (кроме вашего собственного кода) являются потоки и доступ к базе данных, где возвращается один результат (но библиотека не может предположить, что это действительно будет результат). Например, ваш код может быть вызван следующим образом:
Optional<String> name1 = employees.stream().filter(e -> e.getOffice() == 1234).findFirst().map(Employee::getName);
Optional<String> name2 = nameRepository.findById(1234);
multipleOptional(name1, name2);
Обратите внимание, как этот код будет работать правильно, даже если ни сотрудников, ни имен не найдено.
Какая разница (соображения, которые я должен учитывать) между Optional<List<String>>
и List<Optional<String>>
?
Лично я думаю, что оба довольно бессмысленны. Как указано выше, дополнительные параметры обычно используются при получении одного результата, который может присутствовать или не присутствовать. Как таковые, они обычно не используются со списками - в конце концов, если результат отсутствует, то у вас просто не будет его в списке (например, если произойдет запрос, закодированный для возврата списка объектов). чтобы вернуть ноль строк, тогда вы просто получите пустой список - не нужно беспокоиться об опциях).
Таким образом, я не думаю, что когда-либо видел Optional<List<>>
раньше - опять же, ни один результат не обрабатывается нормально пустым списком.
Аналогично, второй должен быть там, где у вас есть список строк, где каждая из них может присутствовать или не присутствовать (или может быть нулевой без опциональных). Опять же, если значение не присутствует, то, вероятно, его не следовало добавлять в Список.