Scala(Scalable Language)

Проработать

  1. SCALA FUTURES
  2. PATTERN MATCHING
  3. Future и Promise
  4. futures-promises
  5. Перестаем бояться футур (futures) в Scala
  6. Собираемся с духом и перестаем бояться монад
  7. Монады в Scala
  8. Back to the Scala Future
  9. Scala Futures
  10. Options in Futures, how to unsuck them
  11. Try, Option or Either?
  12. Моноиды, полугруппы и все-все-все
  13. null in Scala
  14. Понимаем implicit'ы в Scala
  15. Как использовать implicit'ы в Scala и сохранить рассудок
  16. REST страсти по 200
  17. Loops in Scala (Imperative & Tail Recursive)
  18. Play - Handling errors
  19. Play - Dependency Injection
  20. Play - Configuring logging
  21. Play - Protecting against Cross Site Request Forgery
  22. Play - Configuring HTTPS
  23. Введение в Scala.
  24. ИЗМЕНЯЕМЫЕ И НЕИЗМЕНЯЕМЫЕ КОЛЛЕКЦИИ
  25. Scala Интервью Вопросы
  26. Scala Школа!
  27. cats
  28. 9 советов по использованию библиотеки Cats в Scala
  29. 5 уроков, которые я извлек для себя, продолжая осваивать ZIO
  30. Не используйте return в Scala
  31. Каррирование и частичное применение функций
  32. Сопоставление с образцом и функциональная композиция
  33. ФУНКЦИИ ВЫСШЕГО ПОРЯДКА
  34. json4s
  35. Scala коллекции: секреты и трюки
  36. zio
  37. Type class vs case class
  38. Как посчитать количество одинаковых элементов в List?
  39. Узнать разницу scala .andthan со скобочками и через пробелы?

Что это

Это многопарадигмальный язык программирования. Он поддерживает как объектно-ориентированный, так и функциональный язык программирования. Это работает для JVM (виртуальная машина Java).

Основные разделы

Основной scala tech stack

Implicit

Implicit(Неявное)
  1. Неявные параметры - параметры соответствующих типов которые будут переданы в качестве параметров.
  2. Неявные преобразования - позволяют автоматически преобразовать значение одного типа к другому.
    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)
            
  3. Неявные классы
    Пустые типы в scala:
  1. Nothing - это самый нижний тип. Переменную с таким типом можно присвоить любое значение. Exception возвращает Nothing.
  2. Null - trait который реализован в null.
  3. null - наследник всех объектов, но не наследник всех примитивов.
  4. Nil - представление пустых списков.
  5. Unit или () - Эквивалент Java void, который используется для функций, не имеющих возвращаемого типа.
  6. None - Использует Option.

Option

Option - необходим как обёртка над значением(Some()) или его отсутствие(None). И можно без риска использовать функции высшего порядка над переменной(map и тд.).

Either and Try

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 Object

Недостатки Immutable - используется много Heap(молодой) памяти, так как часто удаляются уже использованные объекты.

Tuple

-> - оператор для создания tuple и Map

val foo = List("r", "r",  "s",  "s",  "x",  "x").toStream.groupBy(i => i).mapValues(_.size)
        

Exception

Exception - в Scala исключения действуют так же как и в JAVA, но тут нет "checked"(то есть компилятор их не проверяет) исключений. Выражение trow имеет специальный тип Nothing.

Error - не обрабатываемые исключения тк после из возникновений нет гарантий что программа будет выполняться корректно.

Каррирование(Currying)

Каррирование(Currying) - частичный вызов функции(частичное применение), для дальнейшего использования.

def multiply(m: Int)(n: Int): Int = m * n
val timesTwo = multiply(2) _
timesTwo(3)
        

Alias for import

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}")
        

Pattern matching

Часто используемый паттерн для работы с ходом выполнения программы.

Может использоваться как обычный 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

Object class(Singleton Object) - объект одиночка.

object Box