Введение. Чтобы изучить новую технологию, мы должны изучать ее с помощью вопросов. Нам нужно не только выяснить происхождение и использование этой технологии, но также выяснить, какие преимущества дает нам изучение этой технологии в кодировании.
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. Резюме
-
- Когда может появиться нулевой указатель, вы можете поместить результат в Optional.ofNullable(), а затем использовать orElse() для установки значения по умолчанию.
-
- Научитесь работать с лямбда-выражениями.