Preciso de alguns exemplos de código (e também estou muito curioso sobre eles) de código Scala e Java que mostrem que o código Scala é mais simples e conciso do que o código escrito em Java (é claro que os dois exemplos devem resolver o mesmo problema).
Se houver apenas uma amostra de Scala com comentários como "isso é uma fábrica abstrata em Scala, em Java parecerá muito mais complicado", então também é aceitável.
Obrigado!
Eu gosto mais de tudo aceito e isso responde
java
scala
comparison
language-features
romano
fonte
fonte
Respostas:
Vamos melhorar o exemplo do stacker e usar as classes de caso do Scala :
A classe Scala acima contém todos os recursos da classe Java abaixo e mais alguns - por exemplo, ela oferece suporte a correspondência de padrões (que o Java não tem). Scala 2.8 adiciona argumentos nomeados e padrão, que são usados para gerar um método de cópia para classes de caso, o que oferece a mesma capacidade que os métodos with * da seguinte classe Java.
Então, em uso, temos (é claro):
Contra
fonte
productElements
eunapply
não no construtor, campo ou acessador: gist.github.com/424375case class Person(val firstName: String, val lastName: String)
E daí? Tornar essa coisa privada também seria possível, mas não faz sentido, por causa da não aplicação, etc.case class Person(private val firstName: String)
, mas você não deveria usar classes de caso então. Em vez disso, façaclass Person(firstName: String)
efirstName
é privado por padrão.val
eprivate val
é que se os métodos de acesso, isto é ,firstName()
efirstName(String)
, são públicos ou privados. No Scala, os campos são sempre privados. Para que o Scala gere métodos get / set no estilo Java (além dos acessores no estilo Scala), existe a@BeanProperty
anotação.Eu achei este impressionante
Java
Scala
Bem como estes (desculpe por não colar, eu não queria roubar o código)
fonte
getFirstName
egetLastName
. Você tem que anotar os parâmetros comscala.reflect.BeanProperty
anotações para fazer isso.get
. O código idiomático Java é diferente do código idiomático Scala. Às vezes, ois
prefixo usado para booleanos. davetron5000.github.com/scala-style/naming_conventions/methods/…case class
e obter otoString
,equals
ehashCode
de graça (e também não precisa apresentar os argumentosval
explicitamente):case class Person(firstName: String, lastName: String)
case class
, não apenasclass
.Tarefa: Escreva um programa para indexar uma lista de palavras-chave (como livros).
Explicação:
Java:
Scala:
fonte
Tarefa:
Você tem uma lista
people
de objetos de classePerson
que contém os camposname
eage
. Sua tarefa é classificar essa lista primeiro porname
e depois porage
.Java 7:
Scala:
Atualizar
Desde que escrevi esta resposta, houve algum progresso. Os lambdas (e as referências de método) finalmente chegaram ao Java e estão conquistando o mundo Java.
Esta é a aparência do código acima com Java 8 (contribuição de @fredoverflow):
Embora esse código seja quase tão curto, ele não funciona tão elegantemente quanto o do Scala.
Na solução Scala, o
Seq[A]#sortBy
método aceita uma funçãoA => B
ondeB
é necessário ter umOrdering
.Ordering
é uma classe-tipo. Pense melhor nos dois mundos: tipoComparable
, é implícito para o tipo em questão, mas tipoComparator
, é extensível e pode ser adicionado retrospectivamente a tipos que não o tinham. Como Java não possui classes de tipo, ele deve duplicar cada um desses métodos, uma vez paraComparable
, depois paraComparator
. Por exemplo, vejacomparing
ethenComparing
aqui .As classes de tipo permitem escrever regras como "Se A tem ordenação e B tem ordenação, então sua tupla (A, B) também tem ordenação". Em código, isto é:
É assim que o
sortBy
em nosso código pode ser comparado por nome e depois por idade. Essas semânticas serão codificadas com a "regra" acima. Um programador de Scala intuitivamente espera que isso funcione dessa maneira. Nenhum método de propósito especial comocomparing
teve que ser adicionadoOrdering
.Lambdas e referências de método são apenas a ponta de um iceberg que é a programação funcional. :)
fonte
Tarefa:
Você tem um arquivo XML "empresa.xml" que se parece com este:
Você deve ler este arquivo e imprimir os campos
firstName
elastName
de todos os funcionários.Java: [tirado daqui ]
Scala: [tirado daqui , slide # 19]
[EDIT por Bill; Verifique os comentários da discussão] -
Hmm, como fazer isso sem responder em uma seção de resposta não formatada ... Hmph. Acho que vou editar sua resposta e deixar você excluí-la se incomodar.
É assim que eu faria em Java com melhores bibliotecas:
Este é apenas um hack rápido que envolve nenhuma magia e todos os componentes reutilizáveis. Se eu quisesse adicionar um pouco de mágica, poderia fazer algo melhor do que retornar uma matriz de matrizes de string, mas mesmo assim, GoodXMLLib seria completamente reutilizável. O primeiro parâmetro de scanFor é a seção, todos os parâmetros futuros seriam os itens a serem encontrados, o que é limitado, mas a interface poderia ser ligeiramente aprimorada para adicionar vários níveis de correspondência sem nenhum problema real.
Admito que o Java tem um suporte de biblioteca muito pobre em geral, mas vamos lá - comparar um uso horrível da biblioteca XML de uma década (?) De Java com uma implementação feita com base em ser conciso não é justo - e está longe a partir de uma comparação das línguas!
fonte
Um mapa de ações a serem executadas dependendo de uma string.
Java 7:
Scala:
E tudo com o melhor gosto possível!
Java 8:
fonte
todos.get("hi")
retornaOption[()=>Unit]
que é necessário para corresponder corretamente.val defaultFun = {() => println("task not found")}; todos.getOrElse("hi", defaultFun).apply()
val todos = Map("hi" -> { () => println("Good morning!") }) withDefaultValue { () => println("task not found") }
e entãotodos("hi")()
Estou escrevendo um jogo de Blackjack no Scala agora. Aqui está como meu método dealerWins ficaria em Java:
Veja como fica no Scala:
Viva as funções de ordem superior!
Solução Java 8:
fonte
def dealerWins = !(players exists (_ beats dealer))
Gostei deste exemplo simples de classificação e transformação, tirado do livro 'Beginning Scala' de David Pollak:
Em Scala:
Em Java:
fonte
Que tal Quicksort?
Java
A seguir está um exemplo de java encontrado por meio de uma pesquisa no Google,
o URL é http://www.mycstutorials.com/articles/sorting/quicksort
Scala
Uma tentativa rápida de uma versão Scala. Temporada de caça para melhoradores de código; @)
fonte
partition
para evitar isso.Gostei tanto da resposta do usuário desconhecido que vou tentar melhorá-la. O código a seguir não é uma tradução direta do exemplo Java, mas realiza a mesma tarefa com a mesma API.
fonte
Gosto muito do método getOrElseUpdate, encontrado em mutableMap e mostrado aqui, primeiro Java, sem:
sim - um WordCount, e aqui no scala:
E aqui está em Java 8:
E se você quiser ficar 100% funcional:
filter
esort
já foram mostrados, mas veja como são fáceis de integrar com o mapa:fonte
Este é um exemplo muito simples: inteiros quadrados e, em seguida, adicione-os
Em escala:
O mapa compacto aplica a função a todos os elementos da matriz, portanto:
A dobra para a esquerda começará com 0 como o (s) acumulador (es) e se aplicará
add(s,i)
a todos os elementos (i) da matriz, de modo que:Agora, isso pode ser ainda mais compactado para:
Este eu não vou tentar em Java (dá muito trabalho), transforme XML em um mapa:
Outra linha para obter o mapa do XML:
fonte
sumSquare
no Scala é que ele parece muito enigmático para um desenvolvedor Java, que lhes dará munição contra você para reclamar que o Scala é obscuro e complicado ...Problema: você precisa projetar um método que execute qualquer código fornecido de forma assíncrona.
Solução em Java :
A mesma coisa em Scala (usando atores):
fonte
O padrão do disjuntor do Release It in FaKods de Michael Nygard ( link para o código )
implementação se parece com isto no Scala:
O que eu acho super legal. Parece apenas uma amostra da linguagem, mas é um mixin simples no objeto CircuitBreaker fazendo todo o trabalho.
Referência em outros idiomas Google para "Disjuntor" + seu idioma.
fonte
Estou preparando um documento que fornece vários exemplos de código Java e Scala, utilizando apenas os recursos simples de entender do Scala:
Scala: um Java melhor
Se você gostaria que eu acrescentasse algo, por favor responda nos comentários.
fonte
Por que ninguém postou isso antes:
Java:
116 caracteres.
Scala:
56 caracteres.
fonte
Application
traço considerado prejudicial ... scala-blogs.org/2008/07/…Streams infinitos avaliados lentamente são um bom exemplo:
Aqui está uma questão que trata de fluxos infinitos em Java: Um iterador infinito é um projeto ruim?
Outro bom exemplo são funções de primeira classe e encerramentos:
Java não suporta funções de primeira classe e imitar fechamentos com classes internas anônimas não é muito elegante. Outra coisa que este exemplo mostra que o java não pode fazer é executar o código de um interpretador / REPL. Acho isso extremamente útil para testar trechos de código rapidamente.
fonte
Iterable
eIterator
produzir fluxos infinitos.Este código Scala ...
... seria completamente ilegível em Java, se possível.
fonte