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 Optional
aulas de reduzir NullPointException, mas também melhorar a aparência do código. Mas primeiro precisamos ficar claro que não é para null
uma 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 User
classe, 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 -