Funciones relacionadas con JDK8.0
Siete, clase opcional
-
Clase opcional: Ubicada en el paquete java.util.Optional, es una clase contenedora que representa la existencia o no existencia de un valor (anteriormente, se usaba null para indicar si existe un valor. JDK8.0 comenzó a usar la clase Opcional para expresar mejor si existe un valor). Al mismo tiempo, puede evitar la excepción del puntero nulo.
-
Utilice el método estático en la clase opcional para obtener el objeto opcional:
- de (valor T): crea no vacío, si el valor está vacío, lanza NullPointException
- vacío (): crea un valor vacío
- ofNullable (valor T): crea un objeto opcional, permitiendo valores nulos
-
Acceder al objeto opcional
-
get (): Obtiene el valor, lanza una excepción si el valor está vacío, la información de la excepción es:
Java.util.NoSuchElementException
-
isPresent (): determina si el valor existe
-
oElse (valor T): obtenga el valor, si no hay ningún valor, tome el valor predeterminado
-
orElseGet (Proveedor s): Con lógica, obtenga el valor
-
ifPresent (Consumidor c): Si el valor existe, consume el valor
-
map (Función f): convierte la entrada a otra forma para la salida
//获取Optional的三种方式 Optional<Student> o=Optional.of(new Student());//创建非空值 System.out.println(o.get()); Optional<Student> o2=Optional.empty();//创建空值 System.out.println(o2.get()); Optional<Student> o3=Optional.ofNullable(null);//允许null值 System.out.println(o3.get()); //操作Optional对象 if(o3.isPresent()){ System.out.println(o3.get()); } Student s=o3.orElse( new Student("张三",28, Student.Status.Study)); System.out.println(s); //获取学生的姓名 Student s2=new Student(); Optional<Student> o4=Optional.of(s2); String name=o4.map((s5)->s5.getName()).orElse("no name"); System.out.println(name); o4.ifPresent(System.out::println);//不为空,则消费数据
-
-
Precauciones:
-
Opcional es una clase final y no implementa ninguna interfaz. Cuando todos los programas usan paquetes opcionales para definir atributos de clase, si la clase definida tiene requisitos de serialización de objetos, debido a que la clase Opcional no implementa la interfaz serializable, la operación de serialización de objetos será un problema :
class User implements Serializable { private long id; private String name; private Optional<Long> phone;//不能对象序列化 } //替换策略 class User implements Serializable { private long id; private String name; private Long phone;//不能对象序列化 public Optional<Long> getPhone(){ return Optional.ofNullable(this.phone); } }
-
Es solo una herramienta de contenedor, los métodos ordinarios y las palabras simples en realidad son innecesarios de usar, no lo use para su uso
-