Tutorial de Scala

Resumen del tutorial de Scala

Este tutorial de Scala cubre todos los aspectos y temas de Scala. Aprenderรก todos los fundamentos desde cero, como quรฉ es Scala, el proceso de instalaciรณn de Scala, programas de Scala, funciones de Scala, evaluaciรณn diferida, interfaz de tipos, clases y objetos, herencia, abstracciones, Java y diferencias de escala, etc.

ยฟQuรฉ es Scala?

Scala es un lenguaje de programaciรณn de tipado estรกtico que incorpora programaciรณn funcional y orientada a objetos para aumentar la escalabilidad de las aplicaciones. Scala se ejecuta principalmente en la plataforma JVM y tambiรฉn se puede utilizar para escribir software para plataformas nativas utilizando Scala-Native y JavaScript tiempos de ejecuciรณn a travรฉs de ScalaJs.

Scala es un lenguaje escalable que se utiliza para escribir software para mรบltiples plataformas. De ahรญ que reciba el nombre de โ€œScalaโ€. Este lenguaje estรก destinado a resolver los problemas de Java Al mismo tiempo es mรกs conciso. Diseรฑado inicialmente por Martin Odersky, fue lanzado en 2003.

ยฟPor quรฉ aprender Scala?

Estas son las razones principales para aprender el lenguaje de programaciรณn Scala:

  • Scala es fรกcil de aprender para programadores orientados a objetos, Java desarrolladores. Se estรก convirtiendo en uno de los idiomas populares en los รบltimos aรฑos.
  • Scala ofrece funciones de primera clase para los usuarios
  • Scala se puede ejecutar en JVM, abriendo asรญ el camino a la interoperabilidad con otros lenguajes.
  • Estรก diseรฑado para aplicaciones concurrentes, distribuidas y resistentes basadas en mensajes. Es uno de los idiomas mรกs exigentes de esta dรฉcada.
  • Es un lenguaje conciso, potente y puede crecer rรกpidamente segรบn la demanda de sus usuarios.
  • Estรก orientado a objetos y tiene muchas caracterรญsticas de programaciรณn funcionales que brindan mucha flexibilidad a los desarrolladores para codificar de la manera que deseen.
  • Scala ofrece muchos tipos de patos
  • Tiene menos texto estรกndar si vienes de Java
  • Los frameworks Lift and Play escritos en Scala se encuentran en la curva de crecimiento.

Cรณmo instalar Scala

Para comenzar a escribir programas Scala, debe tenerlo instalado en su computadora. Para hacer esto, deberรก visitar su sitio. https://www.scala-lang.org/download/ para descargar la รบltima versiรณn de Scala.

Siguiendo el enlace, nos encontramos con dos opciones que podemos elegir para instalar Scala en nuestras mรกquinas. Para este tutorial de Scala, descargaremos el IntelliJ IDEA.

Cรณmo instalar Scala

Una vez que visite el enlace de descarga, encontrarรก dos versiones de IntelliJ IDE.

Para este tutorial de Scala, descargaremos la Community Edition, que es gratuita y viene con todo lo que necesita para escribir programas de Scala.

Cรณmo instalar Scala

Paso 1) Seleccionar Community Edition
En la pรกgina, haga clic en el menรบ desplegable de Community Edition.

Nos presenta una opciรณn para descargar IntelliJ IDE junto con JBR que contiene una implementaciรณn JDK (Java Kit de desarrollo) OpenJDK que Scala necesita para compilar y ejecutar el cรณdigo.

Cรณmo instalar Scala

Paso 2) Ejecuta la instalaciรณn
Una vez que descargue IntelliJ, haga doble clic en รฉl para ejecutar el asistente de instalaciรณn y seguir el cuadro de diรกlogo.

Cรณmo instalar Scala

Paso 3) Seleccione una Ubicaciรณn
Elija una ubicaciรณn para instalar el IDE.

Cรณmo instalar Scala

Si por casualidad no descargaste el que tiene el JDK, aรบn asรญ aparece un mensaje que nos indica que podemos marcar la casilla para descargarlo.

Cรณmo instalar Scala

Paso 4) Haga clic en siguiente
Deje los demรกs valores predeterminados como estรกn y haga clic en Siguiente.

Cรณmo instalar Scala

Paso 5) Haga clic en el icono de inicio
Una vez que se complete la instalaciรณn, ejecute IntelliJ IDE haciendo clic en su icono de inicio en el menรบ de inicio como una aplicaciรณn normal.

Cรณmo instalar Scala

Aรบn necesita realizar un paso adicional para agregar el complemento Scala a IntelliJ; Para ello, haga clic en el menรบ desplegable del menรบ de configuraciรณn ubicado en la parte inferior derecha de la pantalla y seleccione la opciรณn de complemento.

Cรณmo instalar Scala

Cรณmo instalar Scala

En la pestaรฑa Marketplace, una bรบsqueda de Scala presentarรก el complemento como el primer resultado en la etiqueta Idiomas.

Paso 6) Instalar complemento
Haga clic en instalar, lo que harรก que el complemento comience la descarga.

Cรณmo instalar Scala

Paso 7) Reinicie el IDE
Una vez completada la descarga, se le pedirรก que reinicie el IDE para que el complemento instalado pueda comenzar a funcionar.

Cรณmo instalar Scala

Despuรฉs de reiniciar, se encontrarรก en la misma pรกgina que antes cuando ejecutamos el IDE, pero esta vez ya hemos instalado el complemento Scala.

Programa Scala Hola Mundo

Paso 1) Seleccione la opciรณn Crear proyecto, lo que nos llevarรก a una pรกgina donde podremos seleccionar el tipo de idioma que utilizarรก nuestro proyecto.

Programa Scala Hola Mundo

Paso 2) Elija Scala seleccionando la casilla de verificaciรณn Scala y haga clic en siguiente.

Programa Scala Hola Mundo

Paso 3) Seleccione una ubicaciรณn para guardar nuestro archivo de proyectos y asigne un nombre a nuestro proyecto.

Programa Scala Hola Mundo

Si el directorio no existe, IntelliJ nos pedirรก permiso para crear la carpeta. Aceptar y hacer clic en finalizar. Serรกs llevado a tu proyecto Scala, que actualmente no tiene ningรบn cรณdigo Scala.

Tomarรก algรบn tiempo cargar algunos รญndices, asรญ que no se preocupe si no puede hacer nada inmediatamente mientras hay una barra de progreso en la parte inferior de su IDE, simplemente significa que su IDE estรก cargando algunos archivos necesarios para ejecutar Scala y ayuda con el autocompletado de IDE.

Paso 4) A continuaciรณn, haremos clic en la pestaรฑa de proyectos a la izquierda del IDE y la expandiremos para que podamos ver el contenido de nuestro proyecto.

Programa Scala Hola Mundo

Por el momento el proyecto estรก vacรญo y solo contiene una carpeta .idea y un archivo hello-world.iml generado por el IDE. Nuestro punto de interรฉs es la carpeta src. Src es donde almacenamos el cรณdigo fuente de nuestro proyecto. Es donde crearemos nuestro primer archivo Scala.

Paso 5) Haga clic derecho en src para abrir un menรบ para crear un nuevo archivo Scala.

Crea un nuevo archivo Scala

Luego crearemos un nombre para el archivo, en este tutorial de Scala usaremos hola y luego elegiremos en un menรบ desplegable quรฉ poner como contenido del archivo Scala. Seleccione "Objeto"

Programa Scala Hola Mundo

Una vez que hagamos esto, tendremos un archivo Scala que tiene un objeto Singleton que usaremos para ejecutar nuestro cรณdigo.

Programa Scala Hola Mundo

Ahora que tiene un archivo Scala con un objeto Hello. Escribirรก su primer programa ampliando el objeto que ha creado utilizando la palabra clave App.

Extender nuestro objeto con la aplicaciรณn le dice al compilador quรฉ cรณdigo ejecutar cuando inicia su programa. Inmediatamente despuรฉs de extender la aplicaciรณn, aparece una flecha verde en el lado izquierdo, lo que indica que ahora puede ejecutar su programa.

Programa Scala Hola Mundo

Programa Scala Hola Mundo

Dentro del objeto Hello, escribimos una funciรณn println() que se usa para imprimir el texto que contiene en la consola. Ejecutaremos nuestro cรณdigo haciendo clic en la flecha verde.

Al hacer clic en la flecha se nos presenta la opciรณn Ejecutar, hola, al hacer clic en ella, nuestro cรณdigo comenzarรก a compilarse y luego de unos segundos veremos los resultados de nuestro programa impresos desde la consola incorporada en el IDE de IntelliJ.

Programa Scala Hola Mundo

Y ahรญ vamos, hemos instalado Scala con รฉxito y ejecutamos nuestro primer programa.

Quรฉ puedes hacer con Scala

  • Desarrollo web front-end con ScalaJS
  • Desarrollo mรณvil, ambos Android Desarrollo e IOS โ€“ con Scala Native
  • Bibliotecas del lado del servidor como HTTP4S, Akka-Http, Play Framework
  • Internet de las cosas usando
  • Desarrollo del juego
  • PNL: procesamiento del lenguaje natural utilizando un conjunto de bibliotecas ScalaNLP
  • Probar tรฉcnicas de programaciรณn avanzadas como la Programaciรณn Funcional y la Programaciรณn Orientada a Objetos.
  • Cree una aplicaciรณn de comunicaciรณn altamente concurrente utilizando actores, una biblioteca para JVM inspirada en Erlang
  • รšselo para aprendizaje automรกtico usando bibliotecas como Figaro que realiza programaciรณn probabilรญstica y Apache. Spark que

Funciones anรณnimas

El lenguaje Scala tiene funciones anรณnimas, que tambiรฉn se denominan literales de funciรณn. Como Scala es un lenguaje funcional, a menudo significa que los desarrolladores dividen grandes problemas en muchas tareas pequeรฑas y crean muchas funciones para resolverlos. Para facilitar la creaciรณn de funciones, Scala contiene estas funciones que se pueden instanciado sin nombre. Podemos asignarlos directamente a variables o definiciones 'def' como se muestra en el siguiente ejemplo de Scala:

val multiplyByTwo = (n:Int) => n * 2
def multiplyByThree = (n:Int) => n *3

Luego podemos usar la forma normal en que usamos las funciones pasรกndoles parรกmetros a continuaciรณn.

multiplyByTwo(3)

//6

multiplyByThree(4)

//12

Estos mรฉtodos resultan รบtiles cuando queremos tener un cรณdigo limpio y conciso. Podemos utilizar funciones anรณnimas al definir mรฉtodos que no sean grandes y no requieran mucho cรณdigo en su cuerpo. Son muy sencillos y no necesitan ninguna ceremonia para crearlos.

Estos mรฉtodos no se limitan a funciones con argumentos y se pueden utilizar para crear instancias de mรฉtodos que no aceptan ningรบn argumento.

val sayHello = ()=>{ println("hello") }

La mayorรญa de estas funciones anรณnimas se utilizan en otras partes de nuestro cรณdigo donde necesitamos crear una funciรณn rรกpida.

Otra razรณn por la que estas funciones tambiรฉn se conocen como funciones en lรญnea. El uso de funciones anรณnimas es un patrรณn comรบn que se usa de manera generalizada en la biblioteca de colecciones para realizar acciones rรกpidas sobre una colecciรณn.

Por ejemplo, tenemos el mรฉtodo de filtro que toma una funciรณn en lรญnea/funciรณn anรณnima para crear otra colecciรณn con solo elementos que cumplen con los criterios que definimos 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รญ los mรฉtodos que tenemos como funciones anรณnimas son los que verifican si el valor que obtenemos de la lista es par o impar y devuelven el elemento.

//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 utilizar comodines donde los parรกmetros de nuestra funciรณn anรณnima no tienen nombre. Por ejemplo

var timesTwo = (_:Int)*2

timesTwo(5)
//10

En este escenario, no nombramos el parรกmetro que estamos pasando. Lo รบnico que usamos es un guiรณn bajo para representarlo.

Evaluaciรณn perezosa

La mayorรญa de los lenguajes evalรบan secuencialmente variables y parรกmetros de funciones, uno tras otro. En Scala, tenemos una palabra clave llamada lazy, que ayuda a tratar con valores que no queremos que se evalรบen hasta que se haga referencia a ellos.

Una variable marcada como perezosa no se evaluarรก donde estรฉ definida, esto se conoce comรบnmente como evaluaciรณn ansiosa, solo se evaluarรก cuando se haga referencia a ella en algรบn momento posterior en el cรณdigo.

Esto puede ser รบtil cuando evaluar un valor puede ser un cรกlculo costoso; si no es el caso que el valor siempre es necesario, podemos ahorrarnos ejecutar un cรกlculo costoso que puede ralentizar nuestro software al hacer que nuestra variable sea lenta.

lazy val myExpensiveValue = expensiveComputation

def runMethod()={
    if(settings == true){
        use(myExpensiveValue)
    }else{
        use(otherValue)
    }
}

Este no es el รบnico caso de uso de variables diferidas. Tambiรฉn ayudan a abordar cuestiones de dependencia circular en el cรณdigo.

En caso de que la configuraciรณn sea falsa, es posible que no necesitemos usar myExpensiveValue, lo que puede evitarnos realizar un cรกlculo costoso que ayuda a garantizar que los usuarios se diviertan usando nuestra aplicaciรณn, ya que sus otras necesidades se pueden calcular correctamente sin ser abrumadoras. el carnero.

En caso de que la configuraciรณn sea falsa, es posible que no necesitemos usar myExpensiveValue, lo que puede evitarnos realizar un cรกlculo costoso que ayuda a garantizar que los usuarios se diviertan usando nuestra aplicaciรณn, ya que sus otras necesidades se pueden calcular adecuadamente sin abrumar. el carnero.

La pereza tambiรฉn ayuda con los argumentos de funciones, donde los argumentos solo se usan cuando se hace referencia a ellos dentro de la funciรณn. Este concepto se denomina parรกmetros de llamada por nombre.

def sometimesUsedString(someValue:String, defaultValue:=> String)={
 if(someValue != null){
   use(defaultValue)
 }else{
   use(someValue)
   }
 }

Muchos lenguajes utilizan el mรฉtodo de llamada por valor para evaluar argumentos. El parรกmetro que se pasa mediante llamada por nombre solo se evaluarรก cuando sea necesario en el cuerpo de la funciรณn y no se evaluarรก antes de eso. Una vez que se evalรบa el valor, se almacena y se puede reutilizar mรกs adelante sin tener que volver a evaluarlo. Este concepto se conoce como memorizaciรณn.

Inferencia de tipo

En Scala, no es necesario declarar tipos para cada variable que crea. Esto se debe a que el compilador de Scala puede realizar inferencias de tipos basรกndose en la evaluaciรณn del lado derecho. Esto permite que su cรณdigo sea mรกs conciso: nos libera de escribir textos repetitivos donde el tipo esperado es obvio.

var first:String = "Hello, "
var second:String = "World"
var third = first + second
//the compile infers that third is of type String

Funciรณn de orden superior

Una funciรณn de orden superior es una funciรณn que puede tomar funciones como argumentos y puede devolver una funciรณn como tipo de retorno. En Scala, las funciones se consideran ciudadanos de primera clase. Usar estas funciones de esta manera nos permite ser muy flexibles en el tipo de programas que podemos crear. Podemos crear funciones dinรกmicamente e incorporar funcionalidad dinรกmicamente a otras funciones.

def doMathToInt(n:Int, myMathFunction:Int=>Int): Int ={
    myMathFunction(n)
}

En la funciรณn anterior, pasamos un int y una funciรณn que toma un int y devuelve un int. Podemos 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 Int como entrada y devuelve un Int como salida.

Una firma de ()=>Int significa que una funciรณn no toma nada como entrada y devuelve un Int como salida. Un ejemplo de una funciรณn como esa serรญa aquella que genera un int aleatorio para nosotros.

def generateRandomInt()={
 return scala.util.Random.nextInt()
}

La funciรณn anterior tiene una firma ()=>Int

Podemos tener una funciรณn que tenga una firma scala ()=>Unidad. Esto significa que las funciones no toman nada y no devuelven un tipo. La funciรณn podrรญa estar haciendo algรบn tipo de cรกlculo cambiando algo para hacer algo predeterminado.

Sin embargo, no se recomiendan estos tipos de mรฉtodos, ya que parecen ser una caja negra que puede afectar a un sistema de maneras desconocidas. Ademรกs, no se pueden probar. Tener tipos de entrada y salida explรญcitos nos permite razonar sobre lo que hace nuestra funciรณn.

Una funciรณn de orden superior tambiรฉn puede devolver una funciรณn.

Por ejemplo, podrรญamos crear un mรฉtodo que cree una funciรณn potenciadora, es decir, tome un nรบmero y le aplique potencia.

def powerByFunction(n:Int):Int=>Int = {
  return (x:Int)=> scala.math.pow(x,n).toInt
}

La funciรณn anterior toma un int. Nuestro tipo de retorno es una funciรณn anรณnima que toma un Int x, * usamos int x como argumento para la funciรณn de potencia.

Zurra

En Scala, podemos convertir una funciรณn que toma dos argumentos en una que toma un argumento a la vez. Cuando pasamos un argumento, lo aplicamos parcialmente y terminamos con una funciรณn que toma un argumento para completar la funciรณn. Currying nos permite crear funciones agregando parcialmente algunos argumentos.

Esto puede ser รบtil para crear funciones dinรกmicamente antes de que tengamos un conjunto completo de argumentos.

def multiply two numbers(n:Int)(m:Int): Unit ={
  return n * m
}

Si necesitamos crear una funciรณn que multiplique por algรบn nรบmero especรญfico, no necesitamos crear otro mรฉtodo de multiplicaciรณn.

Simplemente podemos llamar a .cured en nuestra funciรณn anterior y obtener una funciรณn que tome un argumento primero y devolver una funciรณn parcialmente aplicada.

def multiplyTwoNumbers(n:Int)(m:Int): Unit ={
  return n * m
}

var multiplyByFive = multiplyTwoNumbers(5) 

multiplyByFive(4)

//returns 20

La coincidencia de patrones

Scala tiene un poderoso mecanismo incorporado para ayudarnos a verificar si una variable coincide con ciertos criterios, muy parecido a lo que harรญamos en una declaraciรณn de cambio en Java o en una serie de declaraciones if/else. El lenguaje tiene coincidencia de patrones que podemos usar para verificar si una variable es de un tipo particular. La coincidencia de patrones en Scala es poderosa y se puede usar para desestructurar los componentes que tienen un mรฉtodo de aplicaciรณn para obtener los campos que nos interesan directamente de la variable que estamos comparando.

La coincidencia de patrones de Scala tambiรฉn proporciona una sintaxis mรกs agradable en comparaciรณn con la declaraciรณn de cambio.

myItem match {
  case true => //do something
  case false => //do something else
  case  _ => //if none of the above do this by default
}

Comparamos nuestra variable con un conjunto de opciones, y cuando la variable que estamos comparando cumple con los criterios, la expresiรณn en el lado derecho de la flecha gruesa (=>) se evalรบa y se devuelve como resultado de la coincidencia.

Usamos un guiรณn bajo para detectar casos que no coinciden en nuestro cรณdigo. Refleja el comportamiento del caso predeterminado cuando se trata de declaraciones de cambio.

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 _ => //case we have a type we don't recognize do sth else
}

En el cรณdigo anterior, puede averiguar el tipo de variable myItem y, en funciรณn de eso, derivar a algรบn cรณdigo especรญfico.

La coincidencia de patrones comprueba si la variable coincide

El guiรณn bajo funciona como un marcador de posiciรณn que coincide con cualquier otra condiciรณn que no coincida con los demรกs elementos de las declaraciones de caso anteriores. Tomamos una variable myItem y llamamos al mรฉtodo de coincidencia.

  • comprobamos si myItem es verdadero usando y hacemos algo de lรณgica en el lado derecho de la flecha gruesa "=>".
  • Usamos el guiรณn bajo para hacer coincidir cualquier cosa que no coincida con ninguna de las declaraciones de caso que hemos definido en el cรณdigo.

Con las clases Case, podemos incluso ir mรกs allรก y desestructurar la clase para obtener campos dentro del objeto.

Al usar la palabra clave sellada para definir nuestras clases, obtenemos el beneficio de que el compilador verifique exhaustivamente los casos con los que intentamos comparar y nos avise si nos olvidamos de manejar uno en particular.

Inmutabilidad

Es posible crear valores que otras funciones en Scala no pueden cambiar usando la palabra clave val. Esto se logra en Java utilizando la palabra clave final. En Scala, lo hacemos usando una palabra clave val al crear una variable en lugar de usar var, que es la alternativa que usarรญamos para crear una variable mutable.

Una variable definida con la palabra clave val es de solo lectura, mientras que una definida con var puede ser leรญda y modificada por otras funciones o arbitrariamente por el usuario en el cรณdigo.

var changeableVariable = 8

changeableVariable =10
//the compiler doesn't complain, and the code compiles successfully

println(changeableVariable)
//10

val myNumber = 7

myNumber = 4

//if we try this the code won't compile

Intentar asignar un valor a myNumber despuรฉs de haberlo declarado como val genera un error en tiempo de compilaciรณn o "reasignaciรณn a val".

ยฟPor quรฉ utilizar la inmutabilidad?

La inmutabilidad nos ayuda a evitar que el cรณdigo y otros programadores cambien nuestros valores inesperadamente, lo que conducirรญa a resultados inesperados si pretenden utilizar el valor que almacenamos, en su lugar pueden hacer una copia del mismo. De esta manera, se evitan errores que pueden ser causados โ€‹โ€‹por mรบltiples actores que cambian la misma variable.

Clases y objetos

Todos sabemos que los objetos son entidades del mundo real y que la clase es una plantilla que define los objetos. Las clases tienen tanto estado como comportamientos. Los estados son valores o variables. Los comportamientos son los mรฉtodos en Scala.

Veamos cรณmo se puede definir una clase, crear una instancia de ella y usarla usando Scala.

Aquรญ, la clase llamada Rectรกngulo, que tiene dos variables y dos funciones. Tambiรฉn puede utilizar los parรกmetros l y b directamente como campos en el programa. Tiene un objeto que tiene un mรฉtodo principal y ha creado una instancia de 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 rectangle with length as $length and breadth as  $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 porque el mรฉtodo toString estรก definido para Object en Scala.

Herencia

Scala tiene mรบltiples tipos de herencia (como herencia รบnica, multinivel, mรบltiple, jerรกrquica, hรญbrida) que comparten mucho en comรบn con las formas tradicionales que se encuentran en Java. Puedes heredar tanto de clases como de rasgos. Puede heredar los miembros de una clase en otra clase usando la palabra clave "extiende". Esto permite la reutilizaciรณn.

Es posible heredar de una clase o de varias clases. Tambiรฉn es posible heredar de subclases que a su vez tienen sus superclases, creando una jerarquรญa de herencia en el proceso.

En el siguiente ejemplo de Scala, la clase base es Cรญrculo y la clase derivada es Esfera. Un cรญrculo tiene un valor llamado radio, que se hereda en la clase Esfera. El mรฉtodo calcArea se anula mediante 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 
    }
  }

Abstracciรณn

En Scala, podemos crear mรฉtodos abstractos y campos miembro utilizando clases y rasgos abstractos. Dentro de las clases y rasgos abstractos, podemos definir campos abstractos sin necesariamente 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 se implementan mediante las clases que extienden el rasgo o la clase abstracta. Puede utilizar rasgos para crear contratos sobre lo que nuestra aplicaciรณn deberรญa poder 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 manera, podemos planificar cรณmo se verรก nuestra aplicaciรณn sin implementar los mรฉtodos que pueden ayudarnos a imaginar cรณmo se verรกn los distintos mรฉtodos. Sigue un patrรณn conocido como programaciรณn de abstracciones y no la implementaciรณn real.

La clase precedida por la palabra clave abstract puede contener mรฉtodos tanto abstractos como no abstractos. Sin embargo, las herencias mรบltiples no se admiten en la clase abstracta. Entonces, puedes extender como mรกximo una clase abstracta.

Objetos Singleton

Un Singleton es una clase de la que solo se crea una instancia una vez en un programa. Proviene de un patrรณn de programaciรณn popular y รบtil conocido como "patrรณn singleton". Es รบtil para crear instancias que deben tener una vida รบtil prolongada y a las que se accederรก comรบnmente en todo el programa, cuyo estado es integral para coordinar los eventos de un sistema. Crear una clase de este tipo en Scala es fรกcil ya que Scala nos proporciona un medio sencillo para crear singletons utilizando la palabra clave object.

object UserProfile{
    var userName=""
    var isLoggedIn:Boolean = false
}

Luego podemos hacer referencia a este objeto en todo nuestro programa con la garantรญa de que todas las partes de nuestro programa verรกn los mismos datos ya que solo hay una instancia del mismo.

def getLoggedInStatus():Boolean={
   return UserProfile.isLoggedIn
}

def changeLoggedInStatus():Boolean={
    UserProfile.isLoggedIn = !UserProfile.isLoggedIn
    return  UserProfile.isLoggedIn
}

El concepto de miembros estรกticos no existe en Scala, esa es la razรณn por la que es necesario utilizar objetos singleton, que actรบan como miembros estรกticos de una clase.

Clases implรญcitas

Las clases implรญcitas son la nueva funcionalidad agregada despuรฉs de la versiรณn 2.1. Es principalmente para agregar nuevas funciones a las clases cerradas.

La palabra clave implรญcita debe definirse 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รญcita 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 importarlo en la clase donde lo estรกs usando.

import StringUtil.StringEnhancer

object ImplicitEx extends App {
  val msg = "This is Guru99!"
  println(msg.replaceVowelWithStar)
}

Programaciรณn orientada a objetos (OOP) versus programaciรณn funcional (FP)

En OOP, los programas se construyen agrupando datos y las funciones que operan con esos datos en unidades altamente conectadas. Los objetos llevan sus datos en los campos y mรฉtodos que operan sobre ellos. En este estilo de programaciรณn, la abstracciรณn principal son los datos, ya que los mรฉtodos que se crean estรกn destinados a operar con los datos.

Programaciรณn funcional, por otro lado, separa los datos y las funciones que operan sobre los datos. Esto permite a los desarrolladores tratar las funciones como abstracciรณn y fuerza impulsora al modelar programas.

Scala permite la programaciรณn funcional al considerar a las funciones como ciudadanos de primera clase, lo que permite que se las pase como valores a otras funciones y que se las devuelva como valores tambiรฉn. La combinaciรณn de estos dos paradigmas ha hecho de Scala una excelente opciรณn para crear software complejo en diversas industrias, como la ciencia de datos.

Marcos importantes en Scala

Aquรญ hay algunos marcos importantes de Scala.

  • Jugar es un marco de aplicaciรณn web de cรณdigo abierto que utiliza Arquitectura MVC. Lanzado en 2007 y ahora con licencia Apache, se convirtiรณ en el marco mรกs popular en GitHub en 2013. Empresas como LinkedIn, Walmart, Samsung y Eero utilizan este marco.
  • Altura de elevaciรณn es otro marco web gratuito escrito en Scala lanzado en 2007. Foursquare utiliza el marco Lift. Es un marco de alto rendimiento y mรกs rรกpido de construir.
  • Acre
  • Gatos - Leecork
  • Spark

Soporte de concurrencia

  • Los valores en Scala son inmutables por defecto. Esto lo hace muy adaptable al entorno concurrente.
  • Hay muchas caracterรญsticas en Scala que lo hacen mejor para aplicaciones concurrentes.
  • Los futuros y las promesas facilitan el procesamiento de datos de forma asincrรณnica, lo que favorece el paralelismo.
  • Akka: conjunto de herramientas que utiliza el modelo de concurrencia de Actor. Hay una serie de Actores que actรบan cuando reciben mensajes.
  • Concurrencia usando hilos de Java Tambiรฉn puede ser compatible con Scala.
  • El procesamiento de flujo es otra gran caracterรญstica que permite el procesamiento continuo de datos en tiempo real.

Scala tiene algunas de las mejores bibliotecas de concurrencia del mundo. Java ecosistema.

  • Nativo Java threads
  • Fibras de bibliotecas como Vertex
  • ZIO: una biblioteca que tiene primitivas para ayudarnos a lidiar con la concurrencia y el cรกlculo asincrรณnico
  • STM โ€“ Transacciรณn
  • Futuro: incorporado en el lenguaje Scala

Java contra Scala

Aquรญ estรกn los principales diferencia 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 un lenguaje orientado a objetos y funcional.
Admite una amplia variedad de funciones de programaciรณn funcional, como concurrencia e inmutabilidad.
Desarrollado originalmente como un lenguaje orientado a objetos y comenzรณ a admitir funciones de programaciรณn funcional en los รบltimos dรญas. Todavรญa no es fuerte como lenguaje de programaciรณn funcional.
Utiliza un modelo de actor para admitir la concurrencia, que es moderno. Utiliza el modelo convencional basado en subprocesos para la concurrencia.
Estructuras de soporte: jugar, levantar Soporta Spring, Grails y mucho mรกs.
Soporta evaluaciรณn perezosa No admite evaluaciรณn perezosa
Sin miembros estรกticos Contiene miembros estรกticos
Admite sobrecarga del operador No admite sobrecarga del operador
La compilaciรณn del cรณdigo fuente es comparativamente lenta. La compilaciรณn del cรณdigo fuente es mรกs rรกpida que Scala
Rasgos โ€“ actuar como Java 8 interfaces Java 8 interfaces intentan cerrar la brecha entre clases e interfaces
Es necesario reescribir No es necesario reescribir
No hay garantรญa sobre los cรณdigos libres de errores. Garantรญa total de defectos menores
Admite compatibilidad con versiones anteriores. Scala no admite compatibilidad con versiones anteriores.
OperaLos padres reciben un trato diferente en Java y no son llamadas a mรฉtodos. Todos los operadores en las entradas se realizan mediante un mรฉtodo llamado en Scala.
Admite herencias mรบltiples utilizando clases pero no mediante clases abstractas No soporta herencias mรบltiples usando clases, sino por interfaces
El cรณdigo estรก escrito en forma compacta. El cรณdigo estรก escrito en formato largo.
Scala no contiene la palabra clave estรกtica. Java contiene la palabra clave estรกtica.

Resumen

En este tutorial, aprendiรณ cรณmo comenzar con Scala. Tambiรฉn ha aprendido las caracterรญsticas funcionales y orientadas a objetos. Tambiรฉn has descubierto las similitudes y diferencias entre Java y Escala. Este tutorial deberรญa haberle ayudado con una amplia variedad de ejemplos bien demostrados.

Resumir este post con: