моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Необязательный — новый класс, представленный в java8. Основная проблема, которую он решает, — NullPointerException.
Перевод исходного текста (перевод Baidu, мои недостатки на английском языке): объект-контейнер, который может содержать или не содержать ненулевые значения. isPresent() вернет true, если значение присутствует. Если значения нет, объект считается пустым, а метод isPresent() возвращает false.
Предоставляются дополнительные методы, которые зависят от наличия содержащегося значения, например orElse() (возвращает значение по умолчанию, если значение отсутствует) и ifPresent() (выполняет действие, когда значение присутствует).
Это класс, основанный на значениях; программисты должны рассматривать равные экземпляры как взаимозаменяемые и не должны использовать экземпляры для синхронизации, иначе может произойти непредсказуемое поведение. Например, синхронизация может завершиться неудачей в будущем выпуске.
Основная функция, которую я здесь понимаю, заключается в том, что вы можете передать isPresent()
метод, помогающий оценить пустоту объекта, а затем передатьmap()
, orElse()
,ifPresent()
Сочетание других методов может значительно сократить время рассмотрения кода.
先介绍一下常用所有的接口;
注意:
1. 此列表是列出了本人觉得有意义的接口不是全部。
2. 当前jdk版本为17,其他版本可能会没有一些方法,例如:`or()` 方法在jdk1.9中增加的
Имя интерфейса | Краткое описание функции |
---|---|
Optional<T> empty() | Создайте пустойOptional объект |
Optional<T> of(T value) | Построить непустойOptional возражать, если为空则报错 ! |
Optional<T> ofNullable(T value) | построитьOptional Объект может быть пустым! |
T get() | Получите значение универсального объекта, если значение为空,则报错 |
boolean isPresent() | Пусто, если нетnull Тогда этоtrue |
boolean isEmpty() | Пусто, еслиnull Тогда этоtrue |
ifPresent(Consumer) | Передайте пару функций интерфейса, когда данные不为空 Эта функция выполняется, когда |
ifPresentOrElse(Consumer, Runnable) | Два параметра, первый выполняется, когда он не пуст, а второй выполняется, когда он пуст. Все это функции интерфейса. |
Optional<T> filter | Фильтр для объектов |
Optional<U> map(Function) | Метод преобразования |
Optional<U> flatMap(Function) | Метод преобразования, обычно используемый при преобразовании многослойного изображения в один слой. |
Optional<T> or(Supplier) | При получении объекта为空 При создании нового на основе функции интерфейсаOptional объект |
T orElse(T) | При получении объекта为空 Получите указанный универсальный объект, когда |
T orElseThrow() | 不为空 Возврат объекта,为空 ноNoSuchElementException |
T orElseThrow(Supplier) | 不为空 Возврат объекта,为空 но指定异常 |
下面是常用接口的一些简单的演示
// 1. 构建一个空的 Optional 对象没有任何问题
Optional<Object> empty = Optional.empty();
// 2. 构建一个非空的 Optional 对象没有任何问题
Optional<Object> aa = Optional.of("123");
// 3. 构建一个空的 Optional 对象直接报错 ================ 会报错 of不允许为空
Optional<Object> bb = Optional.of(null);
// 4. 构建一个空的 Optional 对象没有任何问题
Optional<Object> cc = Optional.ofNullable(null);
// 5. 构建一个非空的 Optional 对象没有任何问题
Optional<Object> dd = Optional.ofNullable("123");
Optional<Object> cc = Optional.ofNullable(null);
// 1. 如果为空的时候获取值就会直接报错
Object o = cc.get();
// 2. 如果对象为空,则获取 or 中的 get 方法的值,否则则获取cc的 get 方法中的值
Object o1 = cc.or(() -> Optional.ofNullable("123")).get();
// 3. 如果对象为空,则直接获取的是 123, orElse()中的参数是非空的。 如果对象不为空则直接获取到对象的值
Object o2 = cc.orElse("123");
// 4. 如果对象为空,则获取 or 中的 get 方法的值,否则则获取cc的 get 方法中的值
Object o3 = cc.orElseGet(() -> Optional.ofNullable("123"));
Optional<Object> cc = Optional.ofNullable(null);
// 1. 存在则返回true
boolean present = cc.isPresent();
// 2. 为null返回true
boolean empty = cc.isEmpty();
Optional<Object> cc = Optional.ofNullable(null);
// 1. 如果对象不为空,则执行方法体的内容,否则没有任何操作
cc.ifPresent(item->{
System.out.println("不为空则执行我"+item);
});
// 2. 如果对象不为空,则执行方法体的内容,否则没有任何操作
cc.ifPresentOrElse(item->{
System.out.println("不为空则执行我"+item);
},()->{
System.out.println("为空则执行我");
});
map 方法的使用跟 Stream 中的map方法一样,我的理解这里面的所有的接口方法与 Stream 中重名的用法都是一样的
@Data
public static class User{
private String name;
private Integer age;
}
@Test
void getMapTest(){
User user = new User();
user.setName("123");
Optional<User> optionalUser = Optional.of(user);
// 1. 直接获取 user 对象的 name 的值,这里 map 是当用户不为空的时候执行的
Optional<String> name = optionalUser.map(User::getName);
System.out.println(name.isEmpty()); // 输出 false
Optional<User> optionalUser2 = Optional.ofNullable(null);
// 2. 直接获取 user 对象的 name 的值,这里 map 是当用户不为空的时候执行的
Optional<String> name2 = optionalUser2.map(User::getName);
System.out.println(name2.isEmpty()); // 输出 true
}
Другие методы:
filter
: Этот метод предназначен для фильтрации,Optional<Path> p = uris. stream().filter(uri -> !isProcessedYet(uri)).findFirst() .map(Paths::get);
Я принципиально никогда не использовал его здесь, и такое ощущение, что сценария использования нет.
flatMap
: Я понимаю, что этот метод является преобразованием распаковки: Например, поставьте Stream<Optional<T>>
Перевести вOptional<T>
Stream<Optional<T>> os = ....
Stream<T> s = os.flatMap(Optional::stream)
TODO 这里后面再不吧,暂时也没有太合适的例子
Optional
Представленный в Java 8, он обеспечивает более элегантный и безопасный способ обработки потенциально нулевых значений.Главным образом черезor
,orElse
, ifPresent
Ожидание, пока функциональные методы элегантно определят пустое пространство и выполнят операцию после того, как оно не станет пустым, это может уменьшить количество уровнейif
Суждение делает код элегантным, но у него есть недостатки.函数式
метод ухудшит читаемость кода.а также нужноLambda
Это требует определенного понимания.