Это многопарадигмальный язык программирования. Он поддерживает как объектно-ориентированный, так и функциональный язык программирования. Это работает для 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