Это многопарадигмальный язык программирования. Он поддерживает как объектно-ориентированный, так и функциональный язык программирования. Это работает для JVM (виртуальная машина Java).
case class A(i: Int) case class B(i: Int) implicit def aToB(a: A): B = B(a.i) val a = A(1) val b: B = a println(b)
Option - необходим как обёртка над значением(Some()) или его отсутствие(None). И можно без риска использовать функции высшего порядка над переменной(map и тд.).
Either[Error, T] - это тип, который содержит либо значение, либо указанное исключение.
Try[T] - это подмножество "Either[Error, T]", который содержит либо значение, либо любое исключение. Может быть мутирован в Option.
Вызов по значения - def callByValue(x: Int) = {} - переменная будет получена один раз и используется в методе.
Вызов по имени - def callByName(x: => Int) = {} - переменная будет переполучаться при каждом вызове x в методе.
С использование функции def f(x: Int) = x + 3 def g(f: Int ⇒ Int, x: Int) = f(x) * f(x) println(g(f, 7))
С использованием анонимной функции def g(f: Int ⇒ Int, x: Int) = f(x) * f(x) println(g(_ + 3, 7))
Недостатки Immutable - используется много Heap(молодой) памяти, так как часто удаляются уже использованные объекты.
-> - оператор для создания tuple и Map
val foo = List("r", "r", "s", "s", "x", "x").toStream.groupBy(i => i).mapValues(_.size)
Exception - в Scala исключения действуют так же как и в JAVA, но тут нет "checked"(то есть компилятор их не проверяет) исключений. Выражение trow имеет специальный тип Nothing.
Error - не обрабатываемые исключения тк после из возникновений нет гарантий что программа будет выполняться корректно.
Каррирование(Currying) - частичный вызов функции(частичное применение), для дальнейшего использования.
def multiply(m: Int)(n: Int): Int = m * n val timesTwo = multiply(2) _ timesTwo(3)
import com.json.{Formatter => JsonFormatter}
Если не стоит стрелка - _ <- detectionImageService.deleteById(imageId) значит Future не выполниться
//Проверка внутри for comprehension _ = { println(s"newPlates = ${newPlates}") }
Проверка Future из переменной //TODO: check for Future Await.result(createdPlatesArray, 10 seconds) println(s"test = ${createdPlatesArray}")
Часто используемый паттерн для работы с ходом выполнения программы.
Может использоваться как обычный match(java - switch)
import scala.util.Random val x: Int = Random.nextInt(10) x match case 0 => "zero" case 1 => "one" case 2 => "two" case _ => "other"
Также может быть применен для case classes.
sealed trait Notification case class Email(sender: String, title: String, body: String) extends Notification case class SMS(caller: String, message: String) extends Notification case class VoiceRecording(contactName: String, link: String) extends Notification
def showNotification(notification: Notification): String = notification match case Email(sender, title, _) => s"You got an email from $sender with title: $title" case SMS(number, message) => s"You got an SMS from $number! Message: $message" case VoiceRecording(name, link) => s"You received a Voice Recording from $name! Click the link to hear it: $link" val someSms = SMS("12345", "Are you there?") val someVoiceRecording = VoiceRecording("Tom", "voicerecording.org/id/123") println(showNotification(someSms)) // prints You got an SMS from 12345! Message: Are you there? println(showNotification(someVoiceRecording)) // prints You received a Voice Recording from Tom! Click the link to hear it: voicerecording.org/id/123
Object class(Singleton Object) - объект одиночка.
object Box