Scala, focando em programadores Java. Porem notei que a curva de aprendizado de uma linguagem, principalmente em novo paradigma pode ser drastica demais. Portanto decidi focar mais no aprendizado do paradigma aproveitando o que puder do Java. Apesar de Java nao ser funcional podemos aprender algumas tecnicas interessantes e melhorar nossos projetos atuais.Uma caracteristica importante do paradigma funcional e o projeto dos tipos das linguagens. O uso de tipos como listas, mapas, arvores e conjuntos sao enfatizados para a manipulacao de dados. Nas linguagens mais puras os valores sao imutaveis, logo as variaveis devem ser inicializadas com valores validos. Note que isto e muito importante. Se precisamos inicializar nossas variaveis com valores validos isso significa que nunca teremos variaveis nulas. O proprio inventor do conceito de nulo reconhece que isso e um erro.Caso ainda esteja resistente a reconhecer este erro, lembre-se de quantas NullPointerException seu codigo de producao gerou, ou ao menos quanta complexidade foi adicionada ao codigo atraves de condicionais voce teve de fazer verificando se algo e diferente de null.Claro que podemos apelar para o Null Object Pattern, mas nem sempre e trivial e envolve muito trabalho em alguns casos.O ideal seria o sistema de tipos da nossa linguagem nos ajudar com isso. Vamos ver um exemplo:Option e uma classe abstrata que representa um tipo que pode ou nao ter valor. Teremos mais duas subclasses, uma indicado a existencia de valor e outro a ausencia. O metodo hasValue() informara isso para nos atraves de sua implementacao em cada subclasse. O metodo get() retornar o valor, caso este exista e por fim getOrElse(T alternative) retorna o valor da Option, caso este seja inexistente e retornada a alternativa passada como parametro. As coisas ficarao mais claras com a implementacao das subclasses e uso.Vamos ao subtipo que indica existencia de valor:Como Some representa a existencia de valor o metodo hasValue() sempre retorna true, o metodo get() o valor.Agora o subtipo que representa ausencia de valor:Como None representa ausencia de valor o metodo hasValue() sempre retornara falso, e lancaremos uma excecao caso seja tentado recuperar o valor que nao existe. Ja que None nao possui valor, o metodo equals() sempre retorna true caso seja passada outra instancia de None.Agora vamos fazer uso do nosso novo sistema de tipos:No codigo acima criamos 3 Options e iteramos sobre eles chamando o metodo getOrElse(T alternative), dessa forma, se existe um valor, o mesmo e retornado, caso contrario e retornado o valor alternativo.Tambem podemos voltar a abordagem mais classica, perguntando se existe valor no Option:Chamamos o metodo hasValue para verificar se aquela Option possui um valor e entao o usamos.Por fim, vamos ver como fica o codigo dos nossos metodos que podem retornar um valor ou ausencia de valor e seu uso:Note que o grande ganho com essa abordagem e deixar explicito atraves de codigo que o valor que estamos usando e opcional, o retorno do metodo agora e um Option, bem mais legivel e menos passivel de erros, pois sendo um Option, devemos determinar se o Option e uma instancia de Some antes de usar o valor.Desenvolvendo