1. Введение
заJavaДля разработчиков,null
тип головной боли, который может возникнуть, если вы не будете осторожныNPE(нулевой указатель) проблема. СлишкомJavaЯзык является одной из важных причин, по которой людей критикуют. прежде чем мы устраним одиозноеNPEПрежде чем мы перейдем к вопросу, давайте рассмотрим концепцию null в Java.
2. ноль в Java
Переведено сДокументация по Oracle Java
В языке Java есть два типа, один из нихбазовый тип, другойтип ссылки. Существует также специальный тип без имени, выражение
null
. так какnull
Типы не имеют имен, поэтому их невозможно объявить какnull
переменная типа или преобразуется вnull
тип.null
Цитатаnull
Единственное возможное значение для выражения типа.null
Ссылки могут быть приведены к любому типу ссылки. На самом деле программисты могут игнорироватьnull
типа, можно считать, чтоnull
Просто специальный символ, который может быть любым ссылочным типом.
Из приведенного выше описания мы можем понять, что,На самом деле null — это просто идентификатор ключевого слова. Это не тип и не объект. Он не может напрямую объявлять null и преобразовываться в null. На него можно только ссылаться, а null можно преобразовать в любой ссылочный тип. Когда на объект ссылочного типа Java ссылаются как на null, это означает, что текущий объект не ссылается на объект и для него не выделяется память.Это также основная причина нулевых указателей, когда мы вызываем методы для объектов, на которые нет ссылок.
в большинстве случаевJavaИспользование разработчикаnull
Он предназначен для выражения того, чего не существует.
3. Решение проблемы NPE
Часто у нас есть собственные ожидания относительно существования данных, но такие ожидания не могут быть нами напрямую проконтролированы.Смысл, выражаемый возвращаемым значением null, не ясен и слишком расплывчат.О нем часто судят по тому, соответствует ли онnull
чтобы избежать проблемы с нулевым указателем. Итак, инженеры Google в своемGuava
Разработана библиотека классов инструментовOptional<T>
решатьnull
неуправляемые вопросы. заставить вас использоватьnull
можно использовать более легко и ясноnull
и помочь вам избежать прямого использованияnull
вызванные проблемы.Java 8Поглотите этот дизайн. мы можем напрямую использоватьJavaкоторый предоставилOptional
решить проблему с нулевым указателем. Далее будем учитьсяJava 8серединаOptional
.
4. Необязательно в Java 8
в Яве 8Optional
является классом-оболочкой для необязательного значения. Его значение не только в том, чтобы помочь нам упроститьNPEрешение проблем, но иJavaОтличное дополнение к функциональному программированию. Мы будем рядомAPIОбъяснено, чтобы помочь вам использовать их в реальной разработке.
4.1 Необязательное объявление
Optional
Может быть объявлен только через статические методы. Он предоставляет три статических метода:
empty()возвращает значениеnull
изOptional
Пример
Optional<Object> empty = Optional.empty();
of(T)вернуть значение неnull
изOptional
Пример
Optional<String> nonNull = Optional.of("Felordcn");
ofNullable()Возвращает значение, которое может бытьnull
изOptional
Пример
// value 值来自其它不确定的来源
String value = SomeApi.source();
// 可能为 null
Optional<String> nullable = Optional.ofNullable(value);
// 也可能不为 null
Optional<String> hasValue = Optional.ofNullable(value);
4.2 Другие методы
isPresent()вернуть, если значение существуетtrue
, иначе возвратfalse
. еслиOptional
Значение не определено, вы можете использовать этот метод для проверки безопасности
Optional<String> nonNull = Optional.of("Felordcn");
// true
boolean present =nonNull.isPresent();
get()ПолучатьOptional
Значение в выбрасывается, если пустоNoSuchElementException
аномальный
Optional<String> nonNull = Optional.of("Felordcn");
// Felordcn
String str = nonNull.get();
ifPresent(Consumer)Если значение существует, оно потребляется потребляющей функцией.Consumer
Потребляй, иначе ничего не делай.isPresent()
Расширенное издание
// 非空打印出字符串
nullable.ifPresent(System.out::println);
//等同于
if (nullable.isPresent()) {
System.out.println(nonNull);
}
filter(Predicate)Если значение удовлетворяет функции предикатаPredicate
затем верните этоOptional
, иначе возвратOptional.empty()
Optional<String> nonNull = Optional.of("Felordcn");
Optional<String> felord = nonNull.filter(s -> s.startsWith("Felord"));
// str = "Felordcn"
String str = felord.get();
map(Function)Получить атрибут элементаOptional
. Если имуществоnull
возвращениеOptional.empty()
, иначе вернуть соответствующее значениеOptional
Optional<User> userOpt = Optional.ofNullable(user);
// username 为空 则为 空 Optional
Optional<String> usernameOpt = userOpt.map(User::getUsername);
flatMap(Function)иногда мы возвращаемсяOptional<Optional<T>>
Очень неудобно обрабатывать, нам нужно расширить элемент, мы можем использовать этот метод для обработки, см.Stream Apiродственные методы в
orElse(other)еслиOptional
Значение существует, возвратOptional
, в противном случае укажитеOptional
orElseGet(Supplier)еслиOptional
Значение существует, возвратOptional
, иначе укажите исполнениеSupplier
функция для получения значения
orElseThrow(Supplier<? extends Throwable>)еслиOptional
Значение существует, возвратOptional
, иначе выдает указанныйSupplier
Исключение, предоставляемое функцией
4.3 Новые API в Java 9
or(Supplier) orElseGet
тип улучшения. Возвращает не только конкретное значение, но и функциональный возвратOptional
stream()будетOptional
иStream
пройти через
ifPresentOrElse(Consumer) ifPresent
Метод обеспечивает логику потребления после значения, а логика без значения не предоставляет запись. новый методifPresentOrElse
компенсировать этот недостаток
5. Неправильное понимание опционального
Optional
Очень ароматный, но злоупотреблять им нельзя. Опасным ходом являетсяOptional
передается в качестве аргумента метода. Поскольку ввод является неконтролируемым, вы не можете гарантировать, что ввод будетOptional
Этоnull
. Это прямо противоречитOptional
намерение. Поэтому попробуйте использовать в выраженияхOptional
или используйте его в возвращаемом значении, а не в параметре методаOptional
.
6. Резюме
Да, сегодняOptional
Объяснять. отOptional
дизайн был предназначен для его обычного подхода. мы тоже правыOptional
существуетJava 9Новые API в . Кроме тогоOptional
Это не панацея, только разумное использование может сыграть на руку. Надеюсь, сегодняшняя статья будет вам полезна.
关注公众号:Felordcn获取更多资讯