Обмен технологиями

Одна статья для понимания Необязательно в Java

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. Введение в необязательное

Необязательный — новый класс, представленный в java8. Основная проблема, которую он решает, — NullPointerException.
Перевод исходного текста (перевод Baidu, мои недостатки на английском языке): объект-контейнер, который может содержать или не содержать ненулевые значения. isPresent() вернет true, если значение присутствует. Если значения нет, объект считается пустым, а метод isPresent() возвращает false.
Предоставляются дополнительные методы, которые зависят от наличия содержащегося значения, например orElse() (возвращает значение по умолчанию, если значение отсутствует) и ifPresent() (выполняет действие, когда значение присутствует).
Это класс, основанный на значениях; программисты должны рассматривать равные экземпляры как взаимозаменяемые и не должны использовать экземпляры для синхронизации, иначе может произойти непредсказуемое поведение. Например, синхронизация может завершиться неудачей в будущем выпуске.

Основная функция, которую я здесь понимаю, заключается в том, что вы можете передать isPresent() метод, помогающий оценить пустоту объекта, а затем передатьmap(), orElse()ifPresent() Сочетание других методов может значительно сократить время рассмотрения кода.

2. Часто используемые интерфейсы

先介绍一下常用所有的接口;
注意:
	1. 此列表是列出了本人觉得有意义的接口不是全部。
	2. 当前jdk版本为17,其他版本可能会没有一些方法,例如:`or()` 方法在jdk1.9中增加的
  • 1
  • 2
  • 3
  • 4
Имя интерфейсаКраткое описание функции
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)不为空 Возврат объекта,为空 но指定异常

2.1 Общие интерфейсы просты в использовании

下面是常用接口的一些简单的演示
  • 1

2.1.1 Общие методы создания

// 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");

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2.1.2 Общие методы получения значений


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"));

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2.1.3 Общие методы суждения

Optional<Object> cc = Optional.ofNullable(null);
// 1. 存在则返回true
boolean present = cc.isPresent();
// 2. 为null返回true
boolean empty = cc.isEmpty();
  • 1
  • 2
  • 3
  • 4
  • 5

2.1.4 Метод работы после вынесения решения


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("为空则执行我");
});

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2.2 Введение в метод карты

map 方法的使用跟 Stream 中的map方法一样,我的理解这里面的所有的接口方法与 Stream 中重名的用法都是一样的
  • 1

@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
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

2.2 Другие методы

Другие методы:

2.2.1 Метод фильтра

filter : Этот метод предназначен для фильтрации,Optional<Path> p = uris. stream().filter(uri -> !isProcessedYet(uri)).findFirst() .map(Paths::get); Я принципиально никогда не использовал его здесь, и такое ощущение, что сценария использования нет.

2.2.2 Метод FlatMap

flatMap: Я понимаю, что этот метод является преобразованием распаковки: Например, поставьте Stream<Optional<T>> Перевести вOptional<T>

Stream<Optional<T>> os = ....
Stream<T> s = os.flatMap(Optional::stream)
  • 1
  • 2

3. Часто используемые примеры

TODO 这里后面再不吧,暂时也没有太合适的例子
  • 1

4. Резюме

Optional Представленный в Java 8, он обеспечивает более элегантный и безопасный способ обработки потенциально нулевых значений.Главным образом черезor ,orElse , ifPresent Ожидание, пока функциональные методы элегантно определят пустое пространство и выполнят операцию после того, как оно не станет пустым, это может уменьшить количество уровнейif Суждение делает код элегантным, но у него есть недостатки.函数式 метод ухудшит читаемость кода.а также нужноLambda Это требует определенного понимания.