Por que usar o Scala sobre Java

16

Eu gosto muito do Scala como uma linguagem ... e ainda luto com o motivo pelo qual qualquer empresa deve mudar do Java para o Scala. O Scala é apenas açúcar sintático no topo da JVM ou há melhorias fundamentais no Scala sobre Java que melhorariam os aplicativos do mundo real?

Dakotah North
fonte
4
Isso tem que ter uma duplicata em algum lugar.
2
Parece que você o usou muito (Scala) (bem, mais do que eu) - o que você encontrou em suas experiências pessoais?
FrustratedWithFormsDesigner
Tenho visto perguntas como ... O que os desenvolvedores Java pensam do Scala, O que devo fazer em seguida como desenvolvedor Java, Como inicio minha migração do Java para o Scala ... mas em nenhum lugar onde vi uma pergunta ou uma resposta que se concentra nas principais razões para o uso do Scala como uma linguagem de programação para o desenvolvimento no mundo real.
Dakotah North
1
@ delnan, pelo menos no SO: stackoverflow.com/questions/6073517/… . @DakotahNorth, não cruze as postagens entre os sites da SE - escolha o fórum mais adequado para sua pergunta e poste apenas lá. Em outros sites, sua postagem será encerrada de qualquer maneira, exatamente como aconteceu com a publicação no SO.
Péter Török
1
Aqui é outra, quase exata duplicar no SO, com excelentes respostas: stackoverflow.com/questions/2683914/...
Péter Török

Respostas:

19

Disclaimer: Eu não sou um guru do Scala.

Scala faz duas coisas extremamente bem que Java (atualmente) não faz.

Resolver problemas funcionais

  • No nível mais básico, a Scala possui fechamentos completos com suporte a coleções. Isso significa que você não precisa mais escrever um código de placa da caldeira, como (descaradamente arrancado de um post do DZone)

    public List<Item> bought(User user)
    {
        List<Item> result = new ArrayList();
        for (Item item : currentItems)
        {
            if (user.bought(item))
            {
                result.add(item);
            }
        }
        return result;
    }

Mas, em vez disso, escreva algo como:

def bought(user: User) = items.filter(user bought _)
  • Há um amor mais funcional, mas não estou qualificado para falar sobre isso, porque atualmente ainda sou péssimo em programação funcional :)

Resolva a simultaneidade de maneira mais segura

  • O Scala tem um modelo de atores (+ alguma outra bondade) que é inerentemente mais seguro que os dados mutáveis ​​do Java + bloqueia no modelo Thread (não importa o quão boas as bibliotecas estejam ficando, o Java ainda é prejudicado pela linguagem).

Honestamente, não consigo pensar em mais nada que faça Scala ficar de cabeça e ombros acima de Java. Sim, muitos pequenos ganhos e melhorias, mas também muito mais corda para se pendurar. YMMV

HTH um pouco

Martijn Verburg
fonte
3
Eu gostaria de salientar que o akka (modelo de ator) está disponível para Scala e Java. Veja akka.io
Giorgio
5
Eu gosto do Scala e estou migrando para ele do Java. Ainda assim, isso me irrita quando o Java e o Scala são comparados e os desenvolvedores do Scala tentam escrever o código Java mais detalhado e multilíngue possível e tentam muito substituí-lo pelo Scala one liner. Sem perda de legibilidade acima Java de código poderia caber em 5 linhas, e não 12
mate
2
"Muitos pequenos ganhos e melhorias, sim, mas também muito mais corda para se pendurar." 1
Rob
@lucek Especialmente desde que o fragmento utiliza convenção chaves de C em vez de Java: P
Andres F.
@robjb: "Muitos pequenos ganhos e melhorias, sim, mas também muito mais corda para se pendurar." Não concordo que Scala lhe dê mais corda para se enforcar. Pelo menos, não há explicação para esta afirmação na resposta e não consigo ver uma. Além disso, o Scala não apenas introduz alguns idiomas funcionais sobre uma linguagem OO (como, por exemplo, C # e Java 8), mas também tenta integrar OOP e FP em um paradigma. IMHO isso não é "pequenas melhorias", mas sim uma mudança de paradigma.
Giorgio
9

Isso depende da sua definição de "apenas açúcar sintático". Por exemplo, de que maneira o Java é mais do que apenas açúcar sintático sobre código de máquina?

Qualquer idioma pode fazer menos que o código da máquina, mas nenhum idioma pode fazer mais.

O que as linguagens de alto nível trazem para a tabela é tornar o código mais fácil de ler e entender, mais fácil de compor e detectar mais erros. E, na minha opinião, é o primeiro deles que faz mais diferença - precisamente "apenas açúcar sintático".

Mas considerando apenas os outros dois, ainda existem vantagens do Scala sobre o Java.

Não insistir no assunto, mas ter fechamentos torna o código muito mais fácil de compor do que não ter fechamentos. E embora o Java 7 adicione algo chamado encerramento, eles não serão assim - serão apenas funções anônimas.

Quanto à detecção de mais erros, o manuseio superior da variação da Scala é uma prova suficiente. Além disso, sua ênfase na imutabilidade também evita todos os tipos de erros - não é que o Java não possa ser imutável, mas simplesmente não vem com a biblioteca para fazer isso.

Daniel C. Sobral
fonte
4
Na verdade de Java 'fechamento' não estão vindo até Java 8
Martijn Verburg
1
@ Martijn Obrigado pela correção. Neste ponto, eu realmente não me importo mais.
Daniel C. Sobral
1
Eu diria que o açúcar sintático é apenas uma sintaxe alternativa, além da semântica existente. Como a semântica do código de máquina não inclui objetos, classes, etc., acho que Java não é apenas açúcar sintático sobre código de máquina. O paradigma da semântica e da programação é diferente.
Giorgio
@ Martijn Verburg: Java já possui uma forma de fechamento (na forma de classes internas anônimas). O que falta são funções anônimas (que podem ser consideradas classes especiais anônimas com exatamente um método e alguma sintaxe especial).
Giorgio
@Giorgio - verdade, mas a classe interna Anon é baixo desempenho em comparação com a próxima implementação baseada invokedynamic e é bem, o código fonte feia IMO :-)
Martijn Verburg
2

Além da resposta de Martijn, gostaria de acrescentar que o Scala é mais expressivo que o Java e os benefícios são que: (1) torna você mais produtivo (2) escrever menos código para resolver o mesmo problema significa que você pode reduzir os bugs no seu código (código livre de erros IMHO é um mito).

sakisk
fonte
0

Estou usando o Scala há cerca de 3 meses e ainda não consigo encontrar nada que não pudesse fazer em Java. Para mim, literalmente, cada literatura sobre Scala parece mencionar a mesma coisa clichê . Se o que você está procurando é reduzir o clichê, então o Scala é para você, mas IMHO, por exemplo, o exemplo de filtro fornecido acima também pode ser resolvido usando coleções do apache

<T> CollectionUtils.filter(Predicate<T>...)

ou usar tampas como assim

<T> CollectionUtils.forAllDo(..., Closure<T>)

Mas é claro que é mais detalhado. Eu gosto da inferência de tipo. Ao aprender Scala, você perceberá que é provavelmente o que está acontecendo de qualquer maneira. Na minha opinião, cada idioma vem com + ve e -ve.

user105463
fonte
-3

compreensão de lista, para compreensão.

por exemplo, em java, você escreve:

int myVar;
if (condition) {
  myVar = //some value
}
else {
 myVar = //some other value
}

Em scala, o mesmo código, é muito mais elegantemente escrito (como python) como:

int myVar = (//some value) if (condition) else // other value;

E feito.

Há tanta coisa que o Scala oferece que o Java não. Simplesmente não há comparação. O único problema é que as pessoas estão mais familiarizadas com Java (b / c é o que ensinam nas aulas de CS) e ainda não são tão habilidosas com o paradigma Scala.

Scala tem recursão de cauda, ​​pode retornar tuplas (algo que pode estar chegando no Java 8, eu acho).

Não é uma comparação. O Scala foi desenvolvido por Martin Ordersky, que trabalhou na equipe principal de Java Generics.

Scala é apenas uma linguagem muito superior. É tudo o que há para isso. As pessoas que dizem o contrário simplesmente não exploraram Scala o suficiente para conhecer melhor.

Acima, eu quis dizer otimização de recursão de cauda (que a JVM não pode fazer da maneira que o compilador da Scala).

O Scala também compila e executa mais rapidamente que os aplicativos JVM (Sim, é verdade). Sem mencionar as estruturas. Usamos o Tomcat, por exemplo, e implantamos algumas servelets para manipular o REST.

Uma coisa que o Tomcat não pode fazer são as operações assíncronas que requerem E / S sem bloqueio. Para isso, os desenvolvedores de JAVA normalmente inventaram uma solução alternativa usando uma fila de mensagens (envie a mensagem para a fila, e algum outro processo ou thread a pega e faz o que quiser em segundo plano).

Infelizmente, esse método é cr * p, e um hack sobre as limitações da implantação de servlets Java no Tomcat.

Vá conferir akka + spray. Ele usa os atores da scala (os atores são exatamente como os Threads, exceto que a única maneira de se comunicar é através de mensagens).

E pronto, as chamadas REST assíncronas são fáceis. Tarefa em segundo plano de longa execução? Sem problemas. Basta acionar e esquecer e fazer algumas pesquisas REST para verificar seu status no front-end de vez em quando.

Se você ainda está usando Java e acha que é melhor que o scala, é melhor parar de usar o computador para digitar e voltar aos dias das canetas de pena e escrever à luz de velas. Java é basicamente antediluviano em comparação com Scala.

Vic
fonte
4
Este não é um exemplo de compreensão de lista. E em Java você escreve:int myVar = condition ? someValue : otherValue
Kevin Cline
1
Você deve editar esses //some value //other valuecomentários para /*some value*/estilizar outros ou algo assim. É atualmente atrapalhando o seu destaque de sintaxe: p
KChaloux