Suponha que eu tenha um método, session.get(str: String): String
mas você não saiba se ele retornará uma string ou um valor nulo, porque vem de Java.
Existe uma maneira mais fácil de tratar isso no Scala em vez de session.get("foo") == null
? Talvez alguma magia se aplique como ToOption(session.get("foo"))
e então eu posso tratá-la no modo Scala como
ToOption(session.get("foo")) match {
case Some(_) =>;
case None =>;
}
java
scala
scala-option
José Leal
fonte
fonte
Respostas:
O método
Option
do objeto complementarapply
serve como uma função de conversão de referências anuláveis:fonte
O
Option
objeto tem umapply
método que faz exatamente isso:fonte
Observe que, ao trabalhar com objetos Java, não funcionará como esperado:
fonte
Este é um tópico muito antigo, mas bom!
É verdade que converter qualquer resultado de Não-exceção de Tentar Opção resultará em um ...
... porque Try não é sobre verificação de nulidade, mas apenas uma maneira de lidar funcionalmente com exceções.
Usar Tentar capturar uma exceção e convertê-la em Opção por conveniência só mostrará Nenhum caso ocorra uma exceção.
Você deseja preservar os valores que saem do Try. Isso pode ser nulo.
Mas também é verdade que a lib padrão é bastante confusa às vezes ...
Este comportamento é um pouco inconsistente, mas reflete o uso intencional de Try e Option.
Você usa try para obter tudo o que sai de uma expressão que pode lançar exceções e não se importa com a exceção em si.
O valor que pode resultar pode muito bem ser nulo. Se toOption fornecesse None, você não poderia diferenciar entre uma exceção e um nulo , e isso não é bonito!
Autônomo, você usa a opção para encapsular a existência ou não de algo. Então, nesse caso, Some (nulo) é Nenhum, e isso faz sentido, porque nulo nesse caso representa a ausência de algo. Não há ambigüidade aqui.
É importante ressaltar que em nenhum caso a transparência referencial não é quebrada já que .toOption não é o mesmo que Option ()
Se você realmente precisa impor AMBOS a segurança de exceção E a segurança de nulo, e seu código realmente não precisa diferenciar entre nulo e uma exceção , você só precisa combinar os dois paradigmas! Porque bem, é isso que você quer, certo?
Você pode fazer isso de uma maneira ...
... ou outro ...
... ou o ridiculamente mais feio deles ...
fonte