Por qué usar Scala sobre Java

16

Estoy totalmente interesado en Scala como lenguaje ... y todavía me cuesta entender por qué cualquier compañía debería cambiar de Java a Scala. ¿Scala es solo azúcar sintáctico sobre la JVM o hay mejoras fundamentales en Scala sobre Java que mejorarían las aplicaciones del mundo real?

Dakotah North
fuente
44
Esto tiene que tener un duplicado en alguna parte.
2
Parece que lo has usado mucho (Scala) (bueno, más que yo), ¿qué has encontrado en tus experiencias personales?
FrustratedWithFormsDesigner
He visto preguntas como ... ¿Qué piensan los desarrolladores de Java de Scala? ¿Qué debo hacer a continuación como desarrollador de Java? ¿Cómo puedo iniciar mi migración de Java a Scala? ... pero no dónde he visto una pregunta o Una respuesta que se centra en las razones principales para usar Scala como lenguaje de programación para el desarrollo del mundo real.
Dakotah Norte
1
@delnan, al menos en SO: stackoverflow.com/questions/6073517/… . @DakotahNorth, por favor no cruce publicaciones entre sitios de SE - elija el foro que mejor se adapte a su pregunta y publique solo allí. En otros sitios, su publicación se cerrará de todos modos, tal como sucedió con esa en SO.
Péter Török
1
Aquí hay otro duplicado casi exacto en SO, con excelentes respuestas: stackoverflow.com/questions/2683914/…
Péter Török

Respuestas:

19

Descargo de responsabilidad: no soy un gurú de Scala.

Scala hace dos cosas extremadamente bien que Java (actualmente) no hace.

Resolver problemas funcionales

  • En el nivel más básico, Scala tiene cierres completos con soporte de colecciones. Esto significa que ya no tiene que escribir el código de la placa de la caldera como (descaradamente arrancado de una publicación de 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;
    }

Pero en cambio escribe algo como:

def bought(user: User) = items.filter(user bought _)
  • Hay más amor funcional, pero no estoy calificado para hablar de ello, ya que actualmente todavía apesta en la programación funcional :)

Resolver concurrencia de una manera más segura

  • Scala tiene un modelo de actores (+ alguna otra bondad) que es heredadamente más seguro que los datos mutables de Java + bloqueos en el modelo Thread (no importa cuán buenas sean las bibliotecas, Java todavía se ve obstaculizado por el lenguaje).

Honestamente, no puedo pensar en mucho más que haga que Scala se destaque por encima de Java. Muchas pequeñas mejoras y mejoras, sí, pero también mucha más cuerda para ahorcarse. YMMV

HTH un poco

Martijn Verburg
fuente
3
Me gustaría señalar que akka (modelo de actor) está disponible tanto para Scala como para Java. Ver akka.io
Giorgio,
55
Me gusta Scala y estoy migrando a él desde Java. Aún así me molesta cuando se comparan Java y Scala y los desarrolladores de Scala intentan escribir un código Java tan detallado y multilínea como sea posible e intentan reemplazarlo con Scala one liner. Sin pérdida de legibilidad por encima del código Java podría caber en 5 líneas, no 12
mate
2
"Muchas pequeñas mejoras y mejoras, sí, pero también mucha más cuerda para ahorcarse". +1
Rob el
@lucek Especialmente porque el fragmento usa la convención de llaves en lugar de Java: P
Andres F.
@robjb: "Muchas pequeñas ganancias y mejoras sí, pero también mucha más cuerda para ahorcarse". No estoy de acuerdo con que Scala te dé más sogas para ahorcarte. Al menos, no hay una explicación para esta afirmación en la respuesta y no puedo verla yo mismo. Además, Scala no solo introduce algunos modismos funcionales además de un lenguaje OO (como, por ejemplo, C # y Java 8), sino que también trata de integrar OOP y FP en un paradigma. En mi humilde opinión, esto no es "pequeñas mejoras", sino más bien un cambio de paradigma.
Giorgio
9

Eso depende de su definición de "solo azúcar sintáctico". Por ejemplo, ¿de qué manera Java es más que solo azúcar sintáctico sobre código de máquina?

Cualquier idioma puede hacer menos que el código de máquina, pero ningún idioma puede hacer más.

Lo que los lenguajes de alto nivel aportan a la tabla es hacer que el código sea más fácil de leer y comprender, más fácil de componer y detectar más errores. Y, en mi opinión, es el primero de estos que hace la mayor diferencia: precisamente "solo el azúcar sintáctico".

Pero considerando solo los otros dos, todavía hay ventajas de Scala sobre Java.

No para diferir el punto, pero tener cierres hace que el código sea mucho más fácil de escribir que no tener cierres. Y aunque Java 7 agregará algo llamado cierres, no serán eso, solo serán funciones anónimas.

En cuanto a la captura de más errores, el manejo superior de la varianza de Scala es prueba suficiente de que lo hace. Además, su énfasis en la inmutabilidad también evita todo tipo de errores: no es que Java no pueda ser inmutable, sino que simplemente no viene con la biblioteca para hacerlo.

Daniel C. Sobral
fuente
44
En realidad, los 'cierres' de Java no llegarán hasta Java 8
Martijn Verburg
1
@ Martijn Gracias por la corrección. En este punto, ya no me importa.
Daniel C. Sobral
1
Diría que el azúcar sintáctico es una sintaxis alternativa además de la semántica existente. Dado que la semántica del código de máquina no incluye objetos, clases, etc., creo que Java no es solo el azúcar sintáctico sobre el código de máquina. El paradigma de semántica y programación es diferente.
Giorgio
@Martijn Verburg: Java ya tiene una forma de cierres (en forma de clases internas anónimas). Lo que le faltan son funciones anónimas (que pueden considerarse clases anónimas especiales con exactamente un método y alguna sintaxis especial).
Giorgio
@Giorgio: es cierto, pero la clase interna anon tiene un rendimiento deficiente en comparación con la próxima implementación basada en invocaciones dinámicas y está bien, el código fuente es feo IMO :-)
Martijn Verburg
2

Además de la respuesta de Martijn, me gustaría agregar que Scala es más expresivo que Java y los beneficios son que (1) te hace más productivo (2) escribir menos código para resolver el mismo problema significa que puedes reducir los errores en tu código (en mi humilde opinión el código libre de errores es un mito).

sakisk
fuente
0

He estado usando Scala durante aproximadamente 3 meses y todavía no puedo encontrar nada que no pueda hacer en Java. Para mí, literalmente, cada literatura sobre Scala parece mencionar lo mismo repetitivo . Si lo que está buscando es reducir el repetitivo, entonces Scala es para usted, pero en mi humilde opinión, por ejemplo, el ejemplo de filtro dado anteriormente podría resolverse utilizando colecciones de apache

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

o usar cierres así

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

Pero, por supuesto, más detallado. Sin embargo, me gusta la inferencia de tipos. A medida que aprenda Scala, se dará cuenta de que esto es probablemente lo que está sucediendo de todos modos bajo el capó. En mi opinión, cada idioma viene con + ve y -ve.

usuario105463
fuente
-3

lista de comprensión, para la comprensión.

por ejemplo en java escribes:

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

En scala, el mismo código, se escribe mucho más elegantemente (como python) como:

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

y hecho.

Scala ofrece tanto que Java no. Simplemente no hay comparación en absoluto. El único problema es que las personas están más familiarizadas con Java (b / c, eso es lo que enseñan en las clases de CS) y aún no son tan hábiles con el paradigma Scala.

Scala tiene una recursión de cola, puede devolver tuplas (algo que podría estar llegando en Java 8, creo).

No es una comparación. Scala fue desarrollada por Martin Ordersky, quien trabajó en el equipo central de Java Generics.

Scala es solo un idioma muy superior. Eso es todo al respecto. Las personas que dicen lo contrario simplemente no han explorado Scala lo suficiente como para saberlo mejor.

Arriba, quise decir optimización de recursión de cola (que la JVM no puede hacer como el compilador de Scala).

Scala también compila y ejecuta más rápido que las aplicaciones JVM (Sí, es cierto). Sin mencionar los marcos. Usamos Tomcat, por ejemplo, e implementamos algunos servlets para manejar REST.

Una cosa que Tomcat no puede hacer son las operaciones asincrónicas que requieren E / S sin bloqueo. Para esto, los desarrolladores de JAVA suelen inventar una solución alternativa utilizando una cola de mensajes (envía el mensaje a la cola, y algún otro proceso o hilo lo recoge y hace lo que quieras en segundo plano).

Desafortunadamente, este método es cr * p, y hackea las limitaciones de implementar servlets Java en Tomcat.

Ve a ver akka + spray. Utiliza los actores de scala (los actores son como hilos, excepto que la única forma en que pueden comunicarse es a través de mensajes).

Y hecho, las llamadas REST asincrónicas se hicieron fáciles. Tarea en segundo plano de larga duración? No hay problema. Simplemente dispara y olvida, y realiza algunas encuestas REST para verificar su estado desde el front-end de vez en cuando.

Si todavía usa Java y cree que es mejor que Scala, también puede dejar de usar su computadora para escribir y volver a los días de las plumas y escribir a la luz de las velas. Java es básicamente antediluviano en comparación con Scala.

Vic
fuente
44
Este no es un ejemplo de una lista de comprensión. Y en Java escribes:int myVar = condition ? someValue : otherValue
Kevin Cline
1
Debes editar esos //some value //other valuecomentarios para /*some value*/darle estilo o algo así. Actualmente está arruinando su resaltado de sintaxis: p
KChaloux