Tutorial de Scala
⚡ Resumen inteligente
El tutorial de Scala presenta un lenguaje de programación basado en la JVM, con tipado estático, que combina la programación orientada a objetos y la programación funcional. La guía abarca la instalación, la sintaxis, las características principales y los frameworks que hacen de Scala la herramienta ideal para crear aplicaciones modernas, concurrentes, escalables y concisas.

¿Qué es Scala?
Scala es un lenguaje de programación de tipado estático que combina la programación orientada a objetos y la programación funcional para mejorar la escalabilidad de las aplicaciones. Scala se ejecuta principalmente en la plataforma JVM, y los desarrolladores también pueden usarlo para escribir software para plataformas nativas a través de Scala-Native, o para el navegador a través de ScalaJs y el JavaScript tiempo de ejecución.
Scala es un lenguaje escalable que se utiliza para construir software para múltiples plataformas, que es precisamente como obtuvo su nombre. El lenguaje fue diseñado para resolver varios de los problemas de verbosidad que se encuentran en Java Sin dejar de ser conciso. Martin Odersky diseñó Scala, y la primera versión pública apareció en 2004.
¿Por qué aprender Scala?
Estas son las principales razones para aprender el lenguaje de programación Scala:
- Scala es fácil de aprender para los programadores orientados a objetos y Java desarrolladores, y se ha convertido en uno de los lenguajes más populares en los últimos años.
- Scala ofrece funciones de primera clase para los usuarios.
- Scala se puede ejecutar en el JVMallanando el camino para la interoperabilidad con otros idiomas.
- Está diseñado para aplicaciones concurrentes, distribuidas y resilientes basadas en mensajes, lo que lo convierte en uno de los lenguajes más demandados de esta década.
- Es un lenguaje conciso y potente que puede evolucionar rápidamente según las necesidades de sus usuarios.
- Es un lenguaje orientado a objetos e incluye muchas características de programación funcional, lo que brinda a los desarrolladores mucha flexibilidad en la forma en que escriben código.
- Scala ofrece Duck Typing a través de tipos estructurales.
- Tiene menos texto estándar que Java.
- Los frameworks Lift y Play, escritos en Scala, siguen madurando y ganando popularidad.
Cómo instalar Scala
Para empezar a escribir programas en Scala, necesitas tenerlo instalado en tu ordenador. Para ello, visita el sitio oficial en https://www.scala-lang.org/download/ para descargar la última versión de Scala.
Siguiendo el enlace, se le presentan dos opciones para instalar Scala. Para este tutorial de Scala, utilizaremos la IntelliJ IDEA, que proporciona un excelente soporte para Scala de forma predeterminada.
Una vez que accedas al enlace de descarga, encontrarás dos ediciones del IDE IntelliJ.
Para este tutorial de Scala, descargaremos la edición Community Edition, que es gratuita e incluye todo lo necesario para escribir programas en Scala.
Paso 1) Seleccione la edición comunitaria.
En la página, haga clic en el menú desplegable de la Edición Comunitaria.
Presenta una opción para descargar el IDE IntelliJ junto con JBR, que contiene una implementación de JDK (Java Kit de desarrollo) como OpenJDK que Scala necesita para compilar y ejecutar código.
Paso 2) Ejecuta la instalación.
Una vez que descargue IntelliJ, haga doble clic en el instalador y siga el asistente que aparece en pantalla.
Paso 3) Selecciona una ubicación.
Elija una ubicación para instalar el IDE.
Si no descargaste el paquete que incluye el JDK, el instalador te pedirá igualmente que añadas el JDK marcando una casilla durante la configuración.
Paso 4) Haga clic en Siguiente.
Deje las demás opciones predeterminadas como están y haga clic en Siguiente.
Programa Scala Hola Mundo
Paso 5) Haz clic en el icono de inicio.
Una vez finalizada la instalación, ejecute el IDE IntelliJ haciendo clic en su icono de inicio en el menú Inicio, como si fuera una aplicación normal.
Aún necesitas agregar el complemento de Scala a IntelliJ. Haz clic en el menú desplegable de configuración en la parte inferior derecha de la pantalla y selecciona la opción Complementos.
En la pestaña Marketplace, busca Scala. El plugin aparece como el primer resultado bajo la etiqueta Languages.
Paso 6) Instale el complemento.
Haz clic en Instalar para comenzar la descarga del complemento de Scala.
Paso 7) Reinicia el IDE.
Una vez finalizada la descarga, se le pedirá que reinicie el IDE para que el complemento instalado pueda comenzar a funcionar.
Tras reiniciar, volverás a la misma página que antes, pero ahora el complemento de Scala estará instalado y listo.
Paso 8) Seleccione Crear proyecto, lo que le llevará a una página donde podrá elegir el idioma del proyecto.
Paso 9) Seleccione Scala marcando la casilla de verificación de Scala y haga clic en Siguiente.
Paso 10) Seleccione una ubicación para guardar el archivo del proyecto y asígnele un nombre.
Si el directorio no existe, IntelliJ le pedirá permiso para crear la carpeta. Acepte y haga clic en Finalizar. A continuación, accederá a su proyecto Scala, que actualmente no contiene ningún código Scala.
La carga de los índices lleva algo de tiempo, así que no se preocupe si no puede interactuar con el IDE mientras se muestra una barra de progreso en la parte inferior. El IDE está cargando los archivos necesarios para ejecutar Scala y proporcionar la función de autocompletado.
Paso 11) Haz clic en la pestaña Proyecto, situada a la izquierda del IDE, y expándela para ver el contenido del proyecto.
En este punto, el proyecto está vacío y solo contiene una carpeta .idea y un archivo hello-world.iml generado por el IDE. Lo que nos interesa es la carpeta src, que contiene el código fuente del proyecto. Aquí es donde se crea el primer archivo Scala.
Paso 12) Haz clic con el botón derecho en src para abrir un menú y crear un nuevo archivo Scala.
Elige un nombre para el archivo. Para este tutorial de Scala, usa ¡HolaLuego, seleccione Objeto en el menú desplegable para el tipo de contenido del archivo Scala.
Una vez hecho esto, tendrás un archivo Scala que contiene un objeto singleton que utilizarás para ejecutar el código.
Ahora que tienes un archivo Scala con un objeto Hello, escribe tu primer programa extendiendo el objeto que creaste usando la palabra clave App.
Al extender el objeto con App, se le indica al compilador qué código debe ejecutar al iniciar el programa. Inmediatamente después de extender App, aparece una flecha verde en el lado izquierdo, lo que indica que el programa ya se puede ejecutar.
Dentro del objeto Hello, escribe la función println() para imprimir el texto en la consola. Ejecuta el programa haciendo clic en la flecha verde.
Al hacer clic en la flecha, aparece la opción Ejecutar Hello. Al seleccionarla, se compila el código y, tras unos segundos, la salida del programa aparece en la consola de IntelliJ.
Ya has instalado Scala correctamente y has ejecutado tu primer programa.
Qué puedes hacer con Scala
Scala se utiliza ampliamente en muchos ámbitos debido a su flexibilidad e interoperabilidad con la JVM. Algunos casos de uso comunes son:
- Desarrollo web frontend con ScalaJS.
- Desarrollo móvil para Android y iOS con Scala Native.
- Bibliotecas del lado del servidor como HTTP4S, Akka-Http y Play Framework.
- Aplicaciones del Internet de las Cosas (IoT).
- Desarrollo de juegos.
- Procesamiento del lenguaje natural mediante el conjunto de bibliotecas ScalaNLP.
- Practicar conjuntamente técnicas avanzadas como la programación funcional y la programación orientada a objetos.
- Aplicaciones de comunicación altamente concurrentes que utilizan actores, una biblioteca para la JVM inspirada en Erlang.
- Aprendizaje automático con bibliotecas como Figaro para programación probabilística y Apache Spark para el procesamiento de datos a gran escala.
Funciones anónimas
El lenguaje Scala admite funciones anónimas, también llamadas literales de funciónDebido a que Scala es un lenguaje funcional, los desarrolladores a menudo dividen los problemas grandes en muchas tareas pequeñas y crean muchas funciones. Para facilitar esto, Scala permite que las funciones sean... instanciado sin nombrePuedes asignarlos directamente a variables o a definiciones usando def, como se muestra en el siguiente ejemplo de Scala:
val multiplyByTwo = (n:Int) => n * 2 def multiplyByThree = (n:Int) => n * 3
Luego puedes utilizarlas como funciones normales pasándoles parámetros:
multiplyByTwo(3) //6 multiplyByThree(4) //12
Estos métodos resultan muy útiles cuando se busca un código limpio y conciso. Las funciones anónimas son prácticas para definir métodos pequeños que no requieren mucho código. Son muy sencillas y su creación es muy rápida.
Estos métodos no se limitan a funciones con argumentos y pueden utilizarse para instanciar métodos que no requieren argumentos.
val sayHello = () => { println("hello") }
La mayoría de estas funciones anónimas se utilizan en otras partes del código donde se necesita una función rápida. Por esta razón, también se las conoce como funciones en líneaEl uso de funciones anónimas es un patrón común que aparece en toda la biblioteca de colecciones para realizar acciones rápidas sobre una colección.
Por ejemplo, el método filter utiliza una función en línea para crear otra colección con solo los elementos que cumplen los criterios definidos en la función anónima.
val myList = List(1,2,3,4,5,6,7) val myEvenList = myList.filter((n: Int) => n % 2 == 0) //List(2,4,6) val myOddList = myList.filter((n:Int) => n % 2 != 0) //List(1,3,5,7)
Aquí, las funciones anónimas comprueban si el valor de la lista es par o impar y devuelven el elemento correspondiente.
//the one checking that the value is even (n: Int) => n % 2 == 0 //the one checking that the value is odd (n:Int) => n % 2 != 0
En Scala, también es posible usar comodines cuando el parámetro de la función anónima no tiene nombre. Por ejemplo:
var timesTwo = (_:Int) * 2 timesTwo(5) //10
En este caso, no se especifica el nombre del parámetro. Se utiliza el guion bajo para representarlo.
Evaluación perezosa
La mayoría de los lenguajes evalúan secuencialmente las variables y los parámetros de las funciones, uno tras otro. En Scala, la palabra clave lazy Ayuda a lidiar con valores que no se desean evaluar hasta que se hace referencia a ellos.
Una variable marcada como lazy no se evalúa en el lugar donde se define, lo que se conoce comúnmente como evaluación eager. Solo se evalúa cuando se hace referencia a ella más adelante en el código.
Esto puede ser útil cuando evaluar un valor implicaría un cálculo costoso. Si el valor no siempre es necesario, se evita realizar un cálculo costoso que puede ralentizar el software al hacer que la variable sea de evaluación diferida.
lazy val myExpensiveValue = expensiveComputation def runMethod() = { if(settings == true) { use(myExpensiveValue) } else { use(otherValue) } }
Este no es el único caso de uso para las variables perezosas. También ayudan a lidiar con dependencias circulares en el código.
Si el indicador de configuración es falso, no es necesario usar myExpensiveValue, lo que evita realizar un cálculo costoso. Esto ayuda a garantizar una experiencia fluida para los usuarios, ya que no se desperdician recursos en valores que nunca se leen.
La evaluación perezosa también resulta útil con los argumentos de las funciones, ya que estos solo se utilizan cuando se hace referencia a ellos dentro de la función. Este concepto se denomina parámetros por nombre.
def sometimesUsedString(someValue:String, defaultValue: => String) = { if(someValue != null) { use(defaultValue) } else { use(someValue) } }
Muchos lenguajes utilizan el método de paso por valor para evaluar los argumentos. Un parámetro pasado por nombre solo se evalúa cuando es necesario dentro del cuerpo de la función. Una vez evaluado el valor, se almacena y puede reutilizarse posteriormente sin necesidad de reevaluarlo, un concepto conocido como memorización.
Inferencia de tipo
En Scala, no es necesario declarar el tipo de cada variable que se crea, ya que el compilador de Scala puede inferirlo a partir del lado derecho de una expresión. Esto permite que el código sea más conciso y evita tener que escribir código repetitivo donde el tipo esperado es obvio.
var first:String = "Hello, " var second:String = "World" var third = first + second //the compiler infers that third is of type String
Función de orden superior
Una función de orden superior es aquella que puede recibir funciones como argumentos y devolver una función como tipo de retorno. En Scala, las funciones se consideran elementos de primera clase. Usarlas de esta manera permite una gran flexibilidad en el tipo de programas que se pueden construir. Se pueden crear funciones dinámicamente y proporcionar funcionalidad a otras funciones de forma dinámica.
def doMathToInt(n:Int, myMathFunction:Int=>Int): Int = { myMathFunction(n) }
En la función anterior, se pasa un Int y una función que toma un Int y devuelve un Int. Puedes pasar cualquier función de esa firma. Por firma, nos referimos a la entrada y salida de una función. Una firma de Int => Int significa que una función toma un entero como entrada y devuelve un entero como salida.
Una firma de () => Int Esto significa que una función no recibe ninguna entrada y devuelve un entero como salida. Un ejemplo de dicha función es una que genera un entero aleatorio.
def generateRandomInt() = { return scala.util.Random.nextInt() }
La función anterior tiene una firma () => Int.
Una función también puede tener una firma. () => UnitEsto significa que la función no recibe ningún parámetro y no devuelve ningún tipo de dato. En su lugar, la función puede modificar algún estado o realizar una acción predeterminada.
Este tipo de métodos no son recomendables porque pueden actuar como una caja negra que afecta al sistema de maneras desconocidas. Además, son más difíciles de probar. Especificar los tipos de entrada y salida permite comprender el funcionamiento de la función.
Una función de orden superior también puede devolver otra función. Por ejemplo, se podría crear un método que devuelva una función de potenciación, es decir, una que tome un número y le aplique una potencia.
def powerByFunction(n:Int): Int=>Int = { return (x:Int) => scala.math.pow(x,n).toInt }
La función anterior recibe un Int. Su tipo de retorno es una función anónima que recibe un Int. x y lo utiliza como argumento para la función de potencia.
Zurra
En Scala, puedes convertir una función que recibe dos argumentos en una que recibe uno a la vez. Al pasar un argumento, este se aplica parcialmente y la función resultante recibe el argumento restante para completar la llamada. El currying te permite construir funciones añadiendo parcialmente algunos argumentos.
Esto resulta útil para crear funciones de forma dinámica antes de tener un conjunto completo de argumentos.
def multiplyTwoNumbers(n:Int)(m:Int): Int = { return n * m }
Si necesitas una función que multiplique por un número específico, no necesitas crear otro método de multiplicación. Puedes aplicar un argumento a la función currificada y reutilizar el resultado:
def multiplyTwoNumbers(n:Int)(m:Int): Int = { return n * m } var multiplyByFive = multiplyTwoNumbers(5) _ multiplyByFive(4) //returns 20
La coincidencia de patrones
Scala tiene un potente mecanismo incorporado que te ayuda a comprobar si una variable coincide con ciertos criterios, de forma muy similar a una sentencia switch. Java o una cadena de sentencias if/else. El lenguaje admite la coincidencia de patrones, que puede utilizar para comprobar si una variable es de un tipo particular. La coincidencia de patrones en Scala es potente y puede desestructurar componentes que tienen un unapply Método para obtener los campos que le interesan directamente de la variable que se está comparando.
La coincidencia de patrones en Scala también proporciona una sintaxis más agradable que una sentencia switch.
myItem match { case true => //do something case false => //do something else case _ => //if none of the above do this by default }
Se compara la variable con un conjunto de opciones. Cuando la variable cumple los criterios, la expresión situada a la derecha de la flecha gruesa (=>) se evalúa y devuelve el resultado de la coincidencia.
El guion bajo detecta los casos que no coinciden en el código, reflejando el comportamiento del caso predeterminado en una instrucción switch.
class Animal(var legs:Int, var sound:String) class Furniture(var legs:Int, var color:Int, var woodType:String) myItem match { case myItem:Animal => //do something case myItem:Furniture => //do something else case _ => //unknown type, do something else }
En el código anterior, puedes detectar el tipo de myItem variable y, en función de eso, ramificarse a código específico.
La coincidencia de patrones comprueba si la variable coincide con cada caso en orden.
El guion bajo funciona como un marcador de posición que coincide con cualquier condición que las otras sentencias case no cumplan. Se toma una variable. myItem y llama al match método.
- Compruebe si
myItemistruey ejecuta la lógica del lado derecho de la flecha gruesa “=>”. - Utilice el guion bajo para que coincida con todo aquello que no coincida con ninguna de las sentencias case definidas en el código.
Con las clases de caso, puedes desestructurar la clase para extraccampos t dentro del objeto.
Mediante el uso de la sealed Al usar la palabra clave para definir clases, obtienes el beneficio de que el compilador revise exhaustivamente los casos que intentas hacer coincidir y te avise si olvidas manejar alguno.
Inmutabilidad
Es posible crear valores que no pueden ser modificados por otras funciones en Scala mediante el uso de val palabra clave. Esto se logra en Java mediante el uso de la final palabra clave. En Scala, se utiliza una val al crear una variable en lugar de var, que es la alternativa para variables mutables.
Una variable definida mediante el val La palabra clave es de solo lectura, mientras que una definida con var Puede ser leído y modificado posteriormente por otras funciones o por el usuario en el código.
var changeableVariable = 8 changeableVariable = 10 //the compiler does not complain, and the code compiles successfully println(changeableVariable) //10 val myNumber = 7 myNumber = 4 //this will not compile
Intentando asignar un valor a myNumber después de declararlo como un val genera un error de compilación: “reasignación a val”.
¿Por qué utilizar la inmutabilidad?
La inmutabilidad ayuda a evitar que el código y otros programadores modifiquen valores inesperadamente, lo que podría generar resultados impredecibles. Si quienes utilizan un valor necesitan modificarlo, pueden crear una copia. De esta forma, se evitan errores causados por múltiples usuarios que modifican la misma variable.
Clases y objetos
Los objetos son entidades del mundo real, y una clase es una plantilla que define objetos. Las clases tienen estado y comportamiento. El estado puede ser un valor o una variable. El comportamiento son los métodos en Scala.
La siguiente sección muestra cómo definir una clase, instanciarla y usarla en Scala.
Aquí hay una clase llamada Rectángulo que tiene dos valores y dos funciones. También puede usar los parámetros. l y b directamente como campos en el programa. Tienes un objeto que tiene un método principal e instancia la clase con dos valores.
Ejemplo:
class Rectangle(l: Int, b: Int) { val length: Int = l val breadth: Int = b def getArea: Int = l * b override def toString = s"This is a rectangle with length $length and breadth $breadth" } object RectObject { def main(args: Array[String]) { val rect = new Rectangle(4, 5) println(rect.toString) println(rect.getArea) } }
Todos los campos y métodos son públicos por defecto en Scala. Es esencial utilizar override because toString ya está definido para cada objeto en Scala.
Herencia
Scala tiene varios tipos de herencia (simple, multinivel, múltiple, jerárquica e híbrida) que comparten mucho en común con las formas tradicionales que se encuentran en JavaPuedes heredar tanto de clases como de rasgos. Heredas los miembros de una clase en otra clase usando la palabra clave extendsEsto permite la reutilización.
Es posible heredar de una o varias clases. También es posible heredar de subclases que, a su vez, tienen sus propias superclases, creando así una jerarquía de herencia.
En el ejemplo de Scala que se muestra a continuación, la clase base es Circley la clase derivada es Sphere. Un círculo tiene un valor llamado radio, que se hereda en la clase Esfera. El método calcArea se anula usando la palabra clave override.
Ejemplo:
class Circle { val radius = 5 def calcArea = { println(radius * radius) } } class Sphere extends Circle { override def calcArea = { println(radius * radius * radius) } } object SphereObject { def main(args : Array[String]) { new Sphere().calcArea } }
Abstracdisrupción
En Scala, puedes crear abstracmétodos t y campos miembros usando abstracclases y rasgos t. Dentro de los abdominalestracclases y rasgos, puedes definir abstraccampos t sin implementarlos.
Ejemplo:
trait MakesSound { var nameOfSound:String def sound():String } abstract class HasLegs(var legs:Int) { val creatureName:String def printLegs():String = { return s"$creatureName has this number of legs: $legs" } }
Estos campos son implementados por las clases que extienden el rasgo o abstracclase t. Puedes usar rasgos para crear contracts para lo que una aplicación debería hacer y luego implementar esos métodos más adelante.
trait DatabaseService { def addItemName(itemName:String) def removeItem(itemId:Int) def updateItem(itemId:Int, newItemName:String) }
De esta forma, puedes planificar cómo se verá una aplicación sin implementar los métodos, ayudaping Visualizas cómo aparecerán los distintos métodos. Sigue un patrón conocido como programación para abs.tracciones más que a la implementación real.
Una clase precedida por el abstract La palabra clave puede contener ambos abstract y no abstracmétodos t. Sin embargo, la herencia múltiple no es compatible con abstracclases t, por lo que solo puedes extender un abstracclase t.
Objetos Singleton
Un singleton es una clase que se instancia solo una vez en un programa. Proviene de un patrón de programación popular y útil conocido como el "patrón singleton". Es útil para crear instancias que están destinadas a ser de larga duración y a las que se accede comúnmente a lo largo del programa, donde el estado es integral para coordinar eventos en un sistema. Crear una clase de este tipo en Scala es fácil porque Scala proporciona un medio simple para crear singletons usando el object palabra clave.
object UserProfile { var userName = "" var isLoggedIn:Boolean = false }
A continuación, puede hacer referencia a este objeto en todo el programa con la garantía de que todas las partes del programa verán los mismos datos, ya que solo existe una instancia del mismo.
def getLoggedInStatus():Boolean = { return UserProfile.isLoggedIn } def changeLoggedInStatus():Boolean = { UserProfile.isLoggedIn = !UserProfile.isLoggedIn return UserProfile.isLoggedIn }
En Scala no existe el concepto de miembros estáticos, por lo que se utilizan objetos singleton que actúan como miembros estáticos de una clase.
Clases implícitas
Las clases implícitas son una característica añadida en la versión 2.10 y se utilizan principalmente para agregar nueva funcionalidad a las clases cerradas existentes.
El implicit La palabra clave debe estar definida en una clase, objeto o rasgo. El constructor principal de una clase implícita debe tener exactamente un argumento en su primera lista de parámetros. También puede incluir una lista de parámetros implícitos adicional.
En el siguiente ejemplo de Scala, se agrega una nueva funcionalidad para reemplazar las vocales de una cadena con *.
object StringUtil { implicit class StringEnhancer(str: String) { def replaceVowelWithStar: String = str.replaceAll("[aeiou]", "*") } }
Debes importar la clase implícita en la clase donde la estés utilizando.
import StringUtil.StringEnhancer object ImplicitEx extends App { val msg = "This is Guru99!" println(msg.replaceVowelWithStar) }
Programación Orientada a Objetos (POO) frente a Programación Funcional (PF)
En la POO, los programas se construyen mediante grupos.ping Los datos y las funciones que operan sobre esos datos se convierten en unidades altamente conectadas. Los objetos contienen sus datos en campos y los métodos operan sobre ellos. En este estilo de programación, el elemento principal es el abs.tracLa base son los datos, porque los métodos que se crean están diseñados para operar sobre ellos.
Programación funcionalPor otro lado, separa los datos y las funciones que operan sobre ellos. Esto permite a los desarrolladores tratar las funciones como los datos absolutos.tracción y fuerza impulsora al modelar programas.
Scala posibilita la programación funcional al tratar las funciones como elementos de primera clase, permitiendo que se pasen como valores a otras funciones y que también se devuelvan como valores. La combinación de estos dos paradigmas ha convertido a Scala en una excelente opción para desarrollar software complejo en sectores como la ciencia de datos.
Marcos importantes en Scala
Aquí tienes algunos frameworks importantes para Scala:
- Jugar es un marco de aplicación web de código abierto que utiliza Arquitectura MVCLanzado en 2007 y ahora con licencia Apache, se convirtió en uno de los frameworks más populares en GitHub para 2013. Empresas como LinkedIn, WalmartSamsung y Eero utilizan este marco.
- Lift es otro framework web gratuito escrito en Scala, lanzado en 2007. Foursquare utiliza el framework Lift. Es un framework de alto rendimiento que permite un desarrollo rápido.
- Acre Proporciona un conjunto de herramientas para crear aplicaciones basadas en mensajes, altamente concurrentes, distribuidas y resilientes en la JVM.
- Gatos - Leecork es una biblioteca que proporciona abstracciones para la programación funcional.
- Spark Es un motor de análisis unificado para el procesamiento de datos a gran escala, ampliamente utilizado en flujos de trabajo de big data y aprendizaje automático.
Soporte de concurrencia
- En Scala, los valores son inmutables por defecto, lo que lo hace muy adaptable a entornos concurrentes.
- Scala posee muchas características que lo hacen ideal para aplicaciones concurrentes.
- Los futuros y las promesas facilitan el procesamiento de datos de forma asincrónica, lo que favorece el paralelismo.
- Akka es un conjunto de herramientas que utiliza el modelo de concurrencia de actores. Los actores actúan cuando reciben mensajes.
- Concurrencia usando hilos de Java También es compatible con Scala.
- El procesamiento de flujos de datos es otra gran característica que permite el procesamiento continuo y en tiempo real de los datos.
Scala tiene algunas de las mejores bibliotecas de concurrencia del mundo. Java ecosistema:
- Nativo Java roscas.
- Fibras de bibliotecas como Vertx.
- ZIO es una biblioteca que contiene funciones básicas para ayudar a gestionar la concurrencia y la computación asíncrona.
- Memoria transaccional de software (STM) para transacciones.
- Future, que está integrado en el lenguaje Scala.
Java contra Scala
Aquí están los principales diferencias entre Java y escala.
| Scala | Java |
|---|---|
| Más compacto y conciso. | Fragmentos de código comparativamente más grandes. |
| Diseñado y desarrollado para ser tanto orientado a objetos como funcional. Admite una amplia variedad de características de programación funcional, como la concurrencia y la inmutabilidad. | Originalmente desarrollado como un lenguaje orientado a objetos, comenzó a admitir características de programación funcional en versiones recientes. Sin embargo, aún no es tan potente como Scala para la programación funcional. |
| Utiliza el modelo de actores para admitir la concurrencia. | Utiliza el modelo convencional basado en subprocesos para la concurrencia. |
| Admite marcos de trabajo como Play y Lift. | Compatible con Spring, Grails y muchos más. |
| Admite la evaluación perezosa. | No admite la evaluación perezosa de forma nativa. |
| No hay miembros estáticos. | Contiene miembros estáticos. |
| Admite la sobrecarga del operador. | No admite la sobrecarga de operadores. |
| La compilación del código fuente es relativamente lenta. | La compilación del código fuente es más rápida que con Scala. |
| Los rasgos actúan como Java 8 interfaces. | Java Ocho interfaces intentan salvar la brecha entre clases e interfaces. |
| En ocasiones, es necesario reescribir el código al actualizar versiones. | Por lo general, no es necesario reescribir el texto entre versiones. |
| La seguridad de tipos proporciona una gran fiabilidad al código, pero no una garantía absoluta de que esté libre de errores. | Fuerte estática typing ayuda a reducir muchos defectos en tiempo de ejecución. |
| Presenta algunas limitaciones de compatibilidad con versiones anteriores entre las principales versiones. | Fuerte compatibilidad retroactiva a largo plazo. |
| OperaLos tors se tratan como llamadas a métodos. | OperaLos tors son una sintaxis especial y no son llamadas a métodos. |
| Admite herencia múltiple mediante rasgos. | No admite la herencia múltiple mediante clases; en su lugar, utiliza interfaces. |
| Code Está escrito de forma concisa. | Code está escrito de forma más prolija. |
| Scala no contiene la palabra clave estática. | Java contiene la palabra clave estática. |






















