minhas informações de contato
Correspondência[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Opcional é uma nova classe introduzida em java8. O principal problema que ela resolve é NullPointerException.
Tradução do texto original (tradução do Baidu, minhas deficiências em inglês): um objeto contêiner, que pode ou não conter valores não nulos. isPresent() retornará verdadeiro se o valor estiver presente. Se não houver valor, o objeto é considerado vazio e isPresent() retorna falso.
São fornecidos métodos adicionais que dependem da presença do valor contido, como orElse() (retorna o valor padrão se o valor não estiver presente) e ifPresent() (executa a ação quando o valor está presente).
Esta é uma classe baseada em valores; os programadores devem tratar instâncias iguais como intercambiáveis e não devem usar instâncias para sincronização, caso contrário, poderá ocorrer um comportamento imprevisível. Por exemplo, a sincronização poderá falhar em uma versão futura.
A função principal que entendo aqui é que você pode passar isPresent()
método para auxiliar no julgamento do vazio do objeto e, em seguida, passarmap()
, orElse()
,ifPresent()
A combinação de outros métodos pode reduzir bastante a demora no julgamento do código.
先介绍一下常用所有的接口;
注意:
1. 此列表是列出了本人觉得有意义的接口不是全部。
2. 当前jdk版本为17,其他版本可能会没有一些方法,例如:`or()` 方法在jdk1.9中增加的
Nome da interface | Breve descrição da função |
---|---|
Optional<T> empty() | Construa um vazioOptional objeto |
Optional<T> of(T value) | Construa um não vazioOptional objetar se为空则报错 ! |
Optional<T> ofNullable(T value) | construir umOptional Objeto, pode ficar vazio! |
T get() | Obtenha um valor de objeto genérico, se o valor为空,则报错 |
boolean isPresent() | Vazio se nãonull Então étrue |
boolean isEmpty() | Vazio senull Então étrue |
ifPresent(Consumer) | Passe um par de funções de interface, quando os dados不为空 Esta função é executada quando |
ifPresentOrElse(Consumer, Runnable) | Dois parâmetros, o primeiro é executado quando não está vazio e o segundo é executado quando está vazio. Todas são funções de interface. |
Optional<T> filter | Um filtro para objetos |
Optional<U> map(Function) | Método de conversão |
Optional<U> flatMap(Function) | Método de conversão, comumente usado com conversão multicamadas para uma camada |
Optional<T> or(Supplier) | Ao pegar o objeto为空 Ao criar um novo baseado na função de interfaceOptional objeto |
T orElse(T) | Ao pegar o objeto为空 Obtenha um objeto genérico especificado quando |
T orElseThrow() | 不为空 Objeto de retorno,为空 masNoSuchElementException |
T orElseThrow(Supplier) | 不为空 Objeto de retorno,为空 mas指定异常 |
下面是常用接口的一些简单的演示
// 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
}
Outros métodos:
filter
: Este método é para filtragem,Optional<Path> p = uris. stream().filter(uri -> !isProcessedYet(uri)).findFirst() .map(Paths::get);
Basicamente, nunca o usei aqui e parece que não há cenário de uso.
flatMap
: Entendo que este método é uma conversão de unboxing: por exemplo, coloque Stream<Optional<T>>
Converter paraOptional<T>
Stream<Optional<T>> os = ....
Stream<T> s = os.flatMap(Optional::stream)
TODO 这里后面再不吧,暂时也没有太合适的例子
Optional
Introduzido no Java 8, ele fornece uma maneira mais elegante e segura de lidar com valores potencialmente nulos.Principalmente atravésor
,orElse
, ifPresent
Esperar que métodos funcionais determinem elegantemente o espaço vazio e executem a operação depois que ele não estiver vazio, isso pode reduzir várias camadas deif
O julgamento torna o código elegante, mas as desvantagens são函数式
método reduzirá a legibilidade do código.e também precisaLambda
É preciso uma certa compreensão.