Uma novos recursos Java8: Opcional Classe

Opcional nulo palavra-chave não é um substituto para, mas sim para o julgamento nulo fornece uma implementação mais elegante

NullPointException pode-se dizer que todos os desenvolvedores Java encontrou uma exceção, embora java desde o projeto inicial para os programadores que tentam sair do ponteiro Oliver, mas o ponteiro é de fato real, e designer java só pode fazer ponteiro tornam-se mais simples, fácil de usar, mas não pode ser completamente removido, portanto, apenas as palavras-chave que temos visto na linguagem java diária null.

exceção de ponteiro nulo é uma exceção de tempo de execução, para este tipo de exceção se não houver tratamento estratégia clara, a melhor prática é permitir que o programa travar cedo, mas em muitas cenas, e não o desenvolvedor é nenhuma estratégia de tratamento específico, mas simplesmente não tem conhecimento da existência de uma exceção de ponteiro nulo. Quando uma exceção ocorre, a estratégia de tratamento é simples, adicione uma instrução if para determinar onde não são incomuns, mas estratégias, tais enfrentamento tornar o nosso programa mais e mais julgamento nulo, sabemos que uma boa programação, o código deve ser permitido para tentar aparecer palavra-chave menos nulo, java8 ofereceu Optionalaulas de reduzir NullPointException, mas também melhorar a aparência do código. Mas primeiro precisamos ficar claro que  não é para nulluma palavras-chave alternativas, mas para nula julgamento fornece uma implementação mais elegante, evitando assim NullPointException .

sentimentos A. intuitivos

Suponha que precisamos retornar o comprimento de uma corda, se você não usar ferramentas de terceiros, precisamos chamar o str.length()método:

se (null == str) {// ponteiro nulo é determinada 
    retorno 0; 
} 
str.length retorno ();

Opcional Se a classe, implementada como segue:

retorno Optional.ofNullable (str) .Map (String :: comprimento) .orElse (0);

código relativamente mais concisa opcional, quando o código é grande, é fácil esquecer de julgamento nulo, mas o uso de classes opcionais irá evitar tais problemas.

II. Uso básico

1. Criação de objetos

Criar um objeto nulo

Opcional <String> optStr = Optional.empty ();

O código exemplo acima chama o empty()método cria um vazio Optional<String>tipo de objecto.

Criar objectos: NÃO NULL
fornece um método opcional of()objeto não nulo usado para criar, este método requer que os parâmetros de entrada não pode estar vazio, caso contrário, jogar NullPointException, os exemplos são os seguintes:

Opcional <String> optStr = Optional.of (str); // se str é nulo quando jogado NullPointException

Criar Objeto: permissão para ser nulo
se os parâmetros de entrada não pode ser determinado se a possibilidade da presença de um valor nulo, você pode usar o opcional ofNullable()criar um método de objeto, se o parâmetro for nulo, um objeto nulo é criado. Exemplos são como se segue:

Opcional <String> optStr = Optional.ofNullable (str); // Se str é nulo, em seguida, criar um objeto vazio

2. Transmissão

Streaming é java8 nos trouxe um novo recurso pesado, vamos conjunto de operações para se tornar mais concisa e eficiente, o próximo artigo sobre novos recursos java8, vai lidar com a perda de uma explicação completa. Aqui opcional também fornece dois tratamentos prejuízo básico: mapeamento e filtragem.

Para demonstrar, criamos uma Userclasse, como segue:

/ ** 
 * @author: zhenchao.Wang 2016/09/24 15:36:56 
 * / 
classe User pública { 

    / **用户编号* / 
    long id privado; 

    private String nome; 

    idade int privado; 

    privada opcional <longo> telefone; 

    privada opcional <String> e-mail; 

    Usuário público (String nome, idade int) { 
        this.name = nome; 
        this.age = idade; 
    } 

    //省略setter和getter 
}

Telefone e e-mail não é um homem para estar lá, por isso usamos definição opcional.

Mapa: mapa e flatMap
operação de mapeamento para converter uma entrada em uma outra forma de saída, tal como no exemplo anterior, que tem a sequência de entrada, e a saída é o comprimento da cadeia, isto é um indício, o método que usamos map()para alcançado. Suponha que queremos obter o nome de uma pessoa, então nós podemos alcançar o seguinte:

string name = Optional.ofNullable (usuário) .map (User :: getName) .orElse ( "sem nome");

De modo que quando o parâmetro do usuário não está vazio quando seu nome é devolvido, caso contrário no name , como eu espero que nós tenhamos telefone ou e-mail através da forma acima, a maneira de usar o acima não funciona, porque o retorno após o mapa é opcional, nós chamamos isso de opcional chamado de nidificação, devemos uma vez, a fim de obter os resultados que deseja no mapa:

longa telefone = optUser.map (User :: getPhone) .map (Opcional :: get) .orElse (-1L);

Na verdade, neste momento, a melhor maneira é usar flatMap, passo para obter os resultados que queremos:

longa telefone = optUser.flatMap (User :: getPhone) .orElse (-1L);

flapMap cada fluxo pode ser devolvido pelo método achatada para uma corrente, em particular um artigo transmitido dedicado inferior elaborar.

Filtro: Fliter
filiter, como o nome sugere é uma operação de filtro, que pode passar a operação de filtração como um parâmetro para o método, a fim de atingir a finalidade de filtrar, queremos filtro foi adicionada ao longo de 18 adultos, pode ser alcançada como se segue:

optUser.filter (u -> u.getAge ()> = 18) .ifPresent (u -> System.out.println ( "Adult:" + u));

3. O comportamento padrão

O comportamento padrão é quando a condição opcional operação não está satisfeito realizada, por exemplo, no exemplo acima usamos orElse()é uma ação padrão para objeto opcional para executar uma ação específica está vazio, é claro, há alguma ação padrão quando a condição a operação realizada na presença de um objecto.

Get ()
Acostume-se a obter o valor de uma variável, mas quando a variável não existe será lançada NoSuchElementException, então não tenho certeza se a variável existe, o uso não é recomendado

OrElse (t outro)
quando satisfaz variáveis opcionais do estado predeterminado, OrElse é realizada, tal como quando o str frente é nula, 0 é retornado.

orElseGet (<? estende X> Fornecedor expectionSupplier)
Se as condições não forem estabelecidas, você precisa executar lógica relativamente complexo, em vez de simplesmente retornar à operação, você pode usar orElseGet alcançado:

longa telefone = optUser.map (User :: getPhone) .map (Opcional :: get) .orElseGet (() -> { 
    // faz alguma coisa aqui 
    voltar -1L; 
});

orElseThrow (Fornecedor <? estende X> expectionSupplier)
semelhante aos get () retorna uma exceção quando todas as condições não forem satisfeitas, mas aqui podemos especificar o tipo de exceção retornado.

ifPresent (Consumer <? Super T> )
realizada passou parâmetro de operação quando a condição é satisfeita.

III. Precauções

Opcional é uma classe final não implementa qualquer interface, de modo que quando usamos definição de classe embalagem classe de atributo, se definirmos as classes têm necessidades de serialização, de modo a não implementar Serializable de interface opcional, desta vez para executar serialização operação será um problema:

a classe User os implementos da {Serializable público 

    número / user ** * / 
    Privado Longo ID; 

    private string name; 

    Privada int Age; 

    Privada opcional O <longo> Telefone; // não pode ser serializado 

    privada opcional <String> e-mail; // não pode ser serializado

Mas podemos usar a seguinte política de substituição:

telefonia de longa privado; 

público Opcional <longo> getPhone () { 
    retornar Optional.ofNullable (this.phone); 
}

Parece Facultativo quando o projeto não considerou para ser usado como uma espécie de campo -

Publicado um artigo original · ganhou elogios 1 · vista 71

Acho que você gosta

Origin blog.csdn.net/f_u_c_k_le/article/details/105278616
Recomendado
Clasificación