С опциональным код получается таким элегантным!

Java задняя часть Java EE
С опциональным код получается таким элегантным!

Введение. Чтобы изучить новую технологию, мы должны изучать ее с помощью вопросов. Нам нужно не только выяснить происхождение и использование этой технологии, но также выяснить, какие преимущества дает нам изучение этой технологии в кодировании.

1. Зачем использовать опционально?

1.1 Сценарий 1

Сяомин столкнулся с проблемой при написании кода в компании: чтобы получить номер класса ученика, у Сяомина возникла идея, и он набрал ее:

String  code =  user.getMyClass().getClassroom().getCode();

«Но когда какой-либо из этих объектов пуст, Кен бросает空指针Необыкновенный! «Подумав об этом, Сяо Мин немедленно внес изменения:

if (null != user) {
      MyClass myClass = user.getMyClass();
      if (null != myClass) {
          Classroom classroom = myClass.getClassroom();
          if (null != classroom) {
              String code = classroom.getCode();
          }
      }
  }

Сяо Мин посмотрел на код, который показался ему очень элегантным, и рассмеялся: «Я действительно умный! Хе-хе-хе!»

"Однако как выглядит этот код套娃как? Есть ли решение? «Сяо Мин внезапно замолчал...

1.2 Сценарий 2

Коллега Сяо Мина, Сяо Ван, выучил лямбду на прошлых выходных, думая о том, чтобы продемонстрировать свою истинную силу.

У него проблема: получить максимальный возраст среди студентов, чей возраст больше 21 года.

Он немного подумал и написал следующий код:

int maxAge = userList.stream().map(user -> user.getAge()).filter(age -> age > 21).mapToInt(Integer::intValue).max().getAsInt();

Но когда я запускаю его, я получаю сообщение об ошибке:

Сяо Ван подумал об этом, он, должно быть, столкнулся с нулевым указателем, поэтому я изменю его:

Stream<Integer> integerStream = userList.stream().map(user -> user.getAge()).filter(age -> age > 21);
if(null != integerStream){
    int maxAge = integerStream.mapToInt(Integer::intValue).max().getAsInt();
    System.out.println(maxAge);
}

запустить снова:

Сяо Ван был ошеломлен. . . . . .

1.3 Понимание необязательно

Сяо Мин и Сяо Ван были ошеломлены, потому что они не использовали необязательный гибко.

необязательный — это новая функция, представленная в Java 8, он действует как контейнер, который может содержать объекты или может быть нулевым, что позволяет избежать нулевых указателей.

2. Дополнительные общие методы

2.1 of( )

Помещает определенное значение в необязательный контейнер и возвращает необязательный объект. Но это конкретное значение не может быть нулевым, иначе будет выдано исключение NullPointerException.

Пример:

Optional<Integer> number1 = Optional.of(123);
System.out.println(number1);
System.out.println("----------------");
Optional<Integer> number2 = Optional.of(null);
System.out.println(number2);

результат операции:

2.2 ofNullable( )

Помещает определенное значение в необязательный контейнер и возвращает необязательный объект, который может быть нулевым. Если значение put равно null , возвращается пустой необязательный объект.

Пример:

Optional<String> number1 = Optional.ofNullable("祝福祖国72周年生日快乐");
System.out.println(number1);
System.out.println("----------------");
Optional<Integer> number2 = Optional.ofNullable(null);
System.out.println(number2);

результат операции:

2.3 isPresent( )

Если возвращенный объект не имеет значения, вызов метода isPresent() вернет false, в противном случае он вернет true.

Пример:

List<User> userList = Stream.of(new User("张三", 18), new User("李四", 21)).collect(Collectors.toList());
boolean present = userList.stream().filter(user -> user.getAge() > 21).findFirst().isPresent();
System.out.println(present);

результат операции:

2.4 get( )

Вызов этого метода возвращает значение, если оно есть, и сообщает об ошибке, если значение отсутствует.

Пример:

List<User> userList = Stream.of(new User("张三", 18), new User("李四", 21)).collect(Collectors.toList());
User user1 = userList.stream().filter(user -> user.getAge() > 18).findFirst().get();
System.out.println(user1);
System.out.println("----------");
User user2 = userList.stream().filter(user -> user.getAge() > 21).findFirst().get();
System.out.println(user2);

результат операции:

2.5 ifPresent( )

Этот метод вызывается, если есть значение, иначе не вызывается

Пример:

List<User> userList = Stream.of(new User("张三", 18), new User("李四", 21)).collect(Collectors.toList());
userList.stream().filter(user -> user.getAge() > 18).findFirst().ifPresent(user -> {
    System.out.println(user);
});
System.out.println("----------");
userList.stream().filter(user -> user.getAge() > 21).findFirst().ifPresent(user -> {
    System.out.println(11111111);
    System.out.println(user);
});

результат операции:

2.6 orElse( )

Возвращает, если есть значение, в противном случае возвращает заданное значение по умолчанию.

Пример:

List<Integer> nums = Stream.of(11, 17, 34, 78).collect(Collectors.toList());
Integer num1 = nums.stream().filter(w -> w > 11).mapToInt(Integer::intValue).max().orElse(99);
System.out.println(num1);
System.out.println("--------");
Integer num2 = nums.stream().filter(w -> w > 78).findFirst().orElse(99);
System.out.println(num2);

результат операции:

2.7 orElseGet( )

Возврат, если есть значение, иначе通过一个方法Возвращает заданное значение по умолчанию.

Пример:

public static int getNum(){
    return 12;
}
public static void main(String[] args) {
  List<Integer> nums = Stream.of(11, 17, 34, 78).collect(Collectors.toList());
  Integer num1 = nums.stream().filter(w -> w > 11).mapToInt(Integer::intValue).max().orElse(99);
  System.out.println(num1);
  System.out.println("--------");
  Integer num2 = nums.stream().filter(w -> w > 78).findFirst().orElseGet(()->2);
  System.out.println(num2);
  Integer num3 = nums.stream().filter(w -> w > 78).findFirst().orElseGet(()->getNum());
  System.out.println("--------");
  System.out.println(num3);
}

результат операции:

3. Дополнительный небольшой чехол

User user1= null;
String code1 = Optional.ofNullable(user1).map(w -> w.getMyClass().getClassroom().getCode()).orElse("没有找到符合要求的编码");
System.out.println(code1);
System.out.println("---------");
User user2 = new User("赵敏", 19, new MyClass(new Classroom("13")));
String code2 = Optional.ofNullable(user2).map(w -> w.getMyClass().getClassroom().getCode()).orElse("没有找到符合要求的编码");
System.out.println(code2);

результат операции:

4. Резюме

    1. Когда может появиться нулевой указатель, вы можете поместить результат в Optional.ofNullable(), а затем использовать orElse() для установки значения по умолчанию.
    1. Научитесь работать с лямбда-выражениями.