Necesito algunas muestras de código (y también tengo mucha curiosidad por ellas) de código Scala y Java que muestran que el código Scala es más simple y conciso que el código escrito en Java (por supuesto, ambas muestras deberían resolver el mismo problema).
Si solo hay una muestra de Scala con comentarios como "esto es una fábrica abstracta en Scala, en Java se verá mucho más complicado", entonces esto también es aceptable.
¡Gracias!
Me gusta sobre todo aceptado y esto responde
java
scala
comparison
language-features
romano
fuente
fuente
Respuestas:
Mejoremos el ejemplo del apilador y usemos las clases de casos de Scala :
La clase de Scala anterior contiene todas las características de la siguiente clase de Java y algunas más ; por ejemplo, admite la coincidencia de patrones (que Java no tiene). Scala 2.8 agrega argumentos con nombre y predeterminados, que se utilizan para generar un método de copia para clases de casos, que brinda la misma capacidad que los métodos with * de la siguiente clase Java.
Entonces, en uso tenemos (por supuesto):
En contra
fuente
productElements
yunapply
, no en el constructor, campo o acceso: gist.github.com/424375case class Person(val firstName: String, val lastName: String)
Y qué? Hacer que esa cosa sea privada también sería posible, pero no tiene ningún sentido, debido a que no se aplica, etc.case class Person(private val firstName: String)
, pero entonces no deberías usar clases de casos. En su lugar hacerclass Person(firstName: String)
yfirstName
que es privado de forma predeterminada.val
yprivate val
es que si los métodos de acceso, es decir ,firstName()
yfirstName(String)
, son públicos o privados. En Scala, los campos son siempre privados. Para que Scala genere métodos get / set de estilo Java (además de los accesores de estilo Scala), existe la@BeanProperty
anotación.Encontré este impresionante
Java
Scala
Además de estos (perdón por no pegar, no quería robar el código)
fuente
getFirstName
ygetLastName
. Tienes que anotar los parámetros conscala.reflect.BeanProperty
anotación para hacer eso.get
. El código idiomático de Java es diferente del código idiomático de Scala. A veces, elis
prefijo utilizado para booleanos. davetron5000.github.com/scala-style/naming_conventions/methods/…case class
y obtener eltoString
,equals
yhashCode
gratis (y tampoco tiene que hacer los argumentosval
explícitamente):case class Person(firstName: String, lastName: String)
case class
, no soloclass
.Tarea: escriba un programa para indexar una lista de palabras clave (como libros).
Explicación:
Java:
Scala:
fuente
Tarea:
Tienes una lista
people
de objetos de clasePerson
que tiene camposname
yage
. Su tarea es ordenar esta lista primero porname
y luego porage
.Java 7:
Scala:
Actualizar
Desde que escribí esta respuesta, ha habido bastante progreso. Las lambdas (y las referencias de métodos) finalmente aterrizaron en Java, y están tomando el mundo de Java por asalto.
Así es como se verá el código anterior con Java 8 (contribuido por @fredoverflow):
Si bien este código es casi tan corto, no funciona con tanta elegancia como el de Scala.
En la solución Scala, el
Seq[A]#sortBy
método acepta una funciónA => B
dondeB
se requiere tener unOrdering
.Ordering
es una clase de tipo. Piense lo mejor de ambos mundos:Comparable
es implícito para el tipo en cuestión, peroComparator
es extensible y se puede agregar retrospectivamente a los tipos que no lo tenían. Dado que Java carece de clases de tipos, tiene que duplicar cada uno de esos métodos, una vez porComparable
y luego porComparator
. Por ejemplo, veacomparing
ythenComparing
aquí .Las clases de tipos permiten escribir reglas como "Si A tiene orden y B tiene orden, entonces su tupla (A, B) también tiene orden". En código, eso es:
Así es como
sortBy
en nuestro código se puede comparar por nombre y luego por edad. Esa semántica se codificará con la "regla" anterior. Un programador de Scala esperaría intuitivamente que esto funcionara de esta manera. No secomparing
tuvo que agregar ningún método de propósito especial comoOrdering
.Las lambdas y las referencias a métodos son solo la punta de un iceberg que es la programación funcional. :)
fuente
Tarea:
Tiene un archivo XML "company.xml" que se parece a esto:
Tienes que leer este archivo e imprimir los campos
firstName
ylastName
de todos los empleados.Java: [tomado de aquí ]
Scala: [tomado de aquí , diapositiva n. ° 19]
[EDITAR por Bill; Verifique los comentarios para la discusión] -
Hmm, cómo hacerlo sin responder en una sección de respuesta sin formato ... Hmph. Supongo que editaré tu respuesta y te dejaré eliminarla si te molesta.
Así es como lo haría en Java con mejores bibliotecas:
Este es solo un truco rápido que no involucra magia y todos los componentes reutilizables. Si quisiera agregar algo de magia, podría hacer algo mejor que devolver una matriz de matrices de cadenas, pero incluso así, este GoodXMLLib sería completamente reutilizable. El primer parámetro de scanFor es la sección, todos los parámetros futuros serían los elementos a encontrar que son limitados, pero la interfaz podría mejorarse ligeramente para agregar múltiples niveles de coincidencia sin ningún problema real.
Admitiré que Java tiene un soporte de biblioteca bastante deficiente en general, pero vamos, comparar un uso horrible de la biblioteca XML de una década (?) De Java con una implementación basada en ser conciso simplemente no es justo, y está lejos a partir de una comparación de idiomas!
fuente
Un mapa de acciones a realizar en función de una cadena.
Java 7:
Scala:
¡Y todo está hecho con el mejor sabor posible!
Java 8:
fuente
todos.get("hi")
devuelve loOption[()=>Unit]
que se necesita para coincidir correctamente.val defaultFun = {() => println("task not found")}; todos.getOrElse("hi", defaultFun).apply()
val todos = Map("hi" -> { () => println("Good morning!") }) withDefaultValue { () => println("task not found") }
y luegotodos("hi")()
Estoy escribiendo un juego de Blackjack en Scala ahora. Así es como se vería mi método dealerWins en Java:
Así es como se ve en Scala:
¡Hurra por las funciones de orden superior!
Solución Java 8:
fuente
def dealerWins = !(players exists (_ beats dealer))
Me gustó este simple ejemplo de clasificación y transformación, tomado del libro 'Beginning Scala' de David Pollak:
En Scala:
En Java:
fuente
¿Qué tal Quicksort?
Java
El siguiente es un ejemplo de Java encontrado a través de una búsqueda de Google,
la URL es http://www.mycstutorials.com/articles/sorting/quicksort
Scala
Un intento rápido de una versión de Scala. Temporada abierta para mejoradores de código; @)
fuente
partition
para evitar eso.Me gustó tanto la respuesta del usuario desconocido que voy a intentar mejorarla. El código siguiente no es una traducción directa del ejemplo de Java, pero realiza la misma tarea con la misma API.
fuente
Me gusta mucho el método getOrElseUpdate, que se encuentra en mutableMap y se muestra aquí, primero en Java, sin:
sí, un WordCount, y aquí en scala:
Y aquí está en Java 8:
Y si quieres ir 100% funcional:
filter
ysort
ya se han mostrado, pero mira lo fácil que se integran con el mapa:fuente
Este es un ejemplo muy simple: cuadrados enteros y luego sumarlos
En scala:
El mapa compacto aplica la función a todos los elementos de la matriz, por lo que:
Doblar a la izquierda comenzará con 0 como acumulador (es) y se aplicará
add(s,i)
a todos los elementos (i) de la matriz, de modo que:Ahora esto se puede compactar aún más para:
Este no lo probaré en Java (mucho trabajo), convertir XML en un mapa:
Otro trazador de líneas para obtener el mapa del XML:
fuente
sumSquare
en Scala es que parece muy críptico para un desarrollador de Java, que les dará munición en tu contra para quejarse de que Scala es oscuro y complicado ...Problema: necesita diseñar un método que ejecute cualquier código dado de forma asincrónica.
Solución en Java :
Lo mismo en Scala (usando actores):
fuente
El patrón de disyuntor de Release It de Michael Nygard en FaKods ( enlace al código )
La implementación se ve así en Scala:
Lo que creo que es super bonito. Parece una parte del lenguaje, pero es una simple combinación en el objeto CircuitBreaker que hace todo el trabajo.
Referencia en otros idiomas de Google para "Disyuntor" + su idioma.
fuente
Estoy preparando un documento que da varios ejemplos de código Java y Scala, utilizando solo las características simples de entender de Scala:
Scala: un Java mejor
Si desea que agregue algo, responda en los comentarios.
fuente
Por qué nadie publicó esto antes:
Java:
116 caracteres.
Scala:
56 caracteres.
fuente
Application
rasgo considerado dañino ... scala-blogs.org/2008/07/…Los flujos infinitos evaluados con pereza son un buen ejemplo:
Aquí hay una pregunta que aborda flujos infinitos en Java: ¿Es un iterador infinito un mal diseño?
Otro buen ejemplo son las funciones y cierres de primera clase:
Java no admite funciones de primera clase y la imitación de cierres con clases internas anónimas no es muy elegante. Otra cosa que este ejemplo muestra que java no puede hacer es ejecutar código desde un intérprete / REPL. Encuentro esto inmensamente útil para probar rápidamente fragmentos de código.
fuente
Iterable
yIterator
producir secuencias infinitas.Este código Scala ...
... sería completamente ilegible en Java, si es posible.
fuente