Перейти до вмісту

Scala

Матеріал з K2 ERP Wiki

Приклад:

! } Потрібно контролювати:

}

Практична роль: companion object дає можливість зберігати логіку, пов’язану з типом, але не прив’язану до конкретного екземпляра. Практична роль: Cats оптимізує будувати функціональний Scala-код на основі формальних абстракцій і композиції. ThisBuild / scalaVersion := "3.3.1"

Приклад напряму:
<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">

'''Головне правило:''' хороший Scala-код має бути типобезпечним, композиційним і зрозумілим для команди, а не без зусиль максимально розумним.<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">

println(greet)

* dependency vulnerabilities;
* secrets;
* authentication;
* authorization;
* SQL injection;
* unsafe deserialization;
* logging sensitive data;
* input validation;
* SSRF;
* XSS у web apps;
* API security;
* Akka або actor-message boundaries;
* Spark job permissions;
* cloud credentials. println(parseAge("abc"))
def greet(implicit name: String): String =

</div>
val active: Boolean = true
 name := "my-scala-app",

val numbers = List(1, 2, 3, 4, 5)

<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
== Висновок ==

Рекомендовано:
</div>

 def greet(): String =
== Приклади задач на Scala ==
Mill часто цінують за:
'''Увага:''' Akka дає потужну модель actor-based systems, але потребує розуміння concurrency, message passing і failure handling. * Akka Documentation. println(greet)

JVM або Java Virtual Machine — це середовище виконання, на якому функціонує Scala. Вона особливо корисна для backend-систем, distributed systems, Apache Spark, data engineering, фінансових платформ і складної доменної логіки. Головне правило: у Scala краще починати з `val`, а `var` використовувати лише там, де змінність справді потрібна. implicit val defaultName: String = "Alice"

Практична роль: extension methods роблять API зручнішим і типобезпечнішим, особливо в бібліотеках. class MathSuite extends munit.FunSuite { val name = "Alice"

Вона підтримує:
<syntaxhighlight lang="scala">
'''Перевага:''' Scala дає доступ до зрілої JVM-екосистеми, але дає можливість писати коротший, виразніший і часто більш типобезпечний код, ніж класична Java. Надмірна абстракція здатна зробити код важким для команди.== Див. так само ==
@main def hello(): Unit =

Scala-застосунки мають звичайні security-ризики JVM і backend-систем.

Scala застосовується для в Spark для:

Scala застосовується для у різних типах проєктів. Haskell

Приклад:

Extension methods

Приклад:

Scala підтримує класи й об’єктно-орієнтоване програмування.
  • batch processing;
  • distributed data processing;
  • ETL;
  • data pipelines;
  • streaming;
  • machine learning pipelines;
  • big data transformations;
  • typed Dataset API. .count()

Практична роль: Play був одним із важливих web frameworks у Scala-екосистемі для backend і API. val numbers = List(1, 2, 3, 4, 5)

def applyTwice(x: Int, f: Int => Int): Int =

== Mill ==

 extends AbstractController(cc) {

'''Практична роль:''' for-comprehension робить послідовність операцій читабельнішою, особливо коли кожен крок повертає wrapper type. Вона оптимізує з частиною помилок, але не захищає автоматизовано від поганої авторизації, витоків даних або небезпечних залежностей.<syntaxhighlight lang="scala">

 test("addition works") {

* unit tests;
* integration tests;
* behavior-style tests;
* testing JVM applications;
* Spark testing;
* backend testing.== конкурентні переваги Scala ==
'''критично:''' Scala не змушує обирати лише ООП або FP.

Основні типи:

class User(val name: String, val age: Int) {

  • дуже простих CRUD-застосунків;
  • команд без JVM-досвіду;
  • команд без часу на навчання FP;
  • швидких прототипів;
  • mobile development;
  • embedded;
  • сценаріїв, де Python або Java достатні й простіші;
  • проєктів із високою плинністю junior-розробників;
  • систем, де складна type system буде більше заважати, ніж допомагати.== ZIO ==
case User(name, age) if age >= 18 => s"Hello, adult $name"

Scala CLI корисний для:

.in(file("."))
  • `Right` — успіх;
  • `Left` — помилка. Критерій
'''ZIO'''  функціональна Scala-екосистема для asynchronous, concurrent і resilient applications.

Implicits у Scala 2

}

Try

Практична роль: enums у Scala 3 зручні для моделювання станів, подій, типів повідомлень і доменних варіантів. ScalaTest — популярний testing framework для Scala.

Для чого застосовується для Scala

Безпека Scala-застосунків

<syntaxhighlight lang="scala">

Scala і Kotlin обидві працюють на JVM, але мають різний фокус. Scala застосовується для для backend-розробки. Критерій
У Scala 3 створення обєкта класу часто здатна не вимагати `new`. val data = spark.read.json("data.json")
<syntaxhighlight lang="scala">

{| class="wikitable"

 s"Hello, $name"

Замість `null` у Scala часто використовують:

* збірки проєктів;
* керування залежностями;
* запуску тестів;
* multi-module projects;
* publishing;
* інтеграції з JVM;
* запуску Scala applications.</div>
== Коли Scala здатна бути невдалим вибором ==

== ScalaTest ==
'''For-comprehension'''  зручний синтаксис для роботи з колекціями, Option, Either, Future та іншими типами. Objects використовуються для:

println(even)

'''Практична роль:''' MUnit часто обирають для простого, швидкого й сучасного тестування Scala-коду. f(f(x))

Практична порада: Scala варто обирати, коли команда цінує типобезпеку, функціональний стиль і JVM-інфраструктуру.== Either == </syntaxhighlight>

Небезпека: Scala дає можливість писати дуже абстрактний код, але якщо команда його не розуміє, технічна підтримка системи стає дорожчою.
* Akka HTTP;
* Play Framework;
* http4s;
* ZIO HTTP;
* Tapir;
* Finagle;
* Cats Effect;
* ZIO;
* Doobie;
* Slick;
* Quill.<div style="background:#eef2ff; border-left:6px solid #4f46e5; padding:12px; margin:12px 0;">
'''Практична роль:''' Scala поєднує типобезпеку з type inference, тому код здатна бути коротким без втрати перевірок компілятора. * Play Framework Documentation. Приклад:
</div>
println(today)

Scala так само виступає як обєктно-орієнтованою мовою. case None => Left("Invalid age")

* REST API;
* microservices;
* event-driven systems;
* streaming services;
* financial backends;
* integration services;
* high-load systems;
* data APIs.== JVM ==
== Приватність даних ==

<syntaxhighlight lang="scala">

 }

* implicit parameters;
* implicit conversions;
* extension-like methods;
* type classes;
* context passing.== Тематичні мітки ==
}
</div>

 case User(name, _) => s"Hello, $name"

def parseAge(text: String): Either [String, Int] =

== Cats ==

val age = 25
ScalaTest застосовується для для:
Зазвичай:

<syntaxhighlight lang="bash">

* навчання;
* швидких скриптів;
* невеликих проєктів;
* запуску single-file programs;
* experiments;
* простішого старту зі Scala. case New, Active, Blocked

</div>

def findUser(id: Int): Option [String] =

* JVM-сумісність;
* статична типізація;
* type inference;
* functional programming;
* object-oriented programming;
* case classes;
* pattern matching;
* immutable collections;
* powerful type system;
* Apache Spark;
* Akka;
* Cats і ZIO;
* Java interoperability;
* виразний синтаксис;
* strong domain modeling;
* зручність для distributed systems. Play застосовується для для:
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
 user match {

enum Status:

import scala.concurrent.ExecutionContext.Implicits.global

 println(s"[LOG] $message")

* опису effects як значень;
* async programming;
* resource safety;
* concurrency;
* cancellation;
* functional services;
* pure FP architecture. class Service extends Logger {
</div>
Scala має сильну екосистему collections. Типові задачі:
Case classes автоматизовано дають:

Futures використовуються для:

Висновок: Kotlin часто виступає як практичнішою заміною Java, а Scala — мовою для глибшого FP, типобезпеки й data engineering. case class User(id: Long, name: String, active: Boolean) </syntaxhighlight> println(users)

println(parseAge("25"))

</syntaxhighlight>

критично: sbt дуже потужний, але здатна бути складним для новачків через власну модель налаштувань і DSL. Scala
! Scala
Поширені колекції:
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">

 .groupBy("country")

<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">

Akka застосовується для для:

<syntaxhighlight lang="scala">
Scala має обмеження. ZIO застосовується для для:
 test("addition") {

<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
{| class="wikitable"

</div>

* async operations;
* network calls;
* parallel computation;
* non-blocking APIs;
* backend services. println(message)

<div style="background:#eef2ff; border-left:6px solid #4f46e5; padding:12px; margin:12px 0;">

* effect management;
* typed errors;
* concurrency;
* resource safety;
* dependency injection;
* streams;
* testing;
* backend services. Scala

 case s: String => s"text: $s"

</div>
 def add(a: Int, b: Int): Int =

</div>
Приклад:

def greet(using name: String): String =
def describe(event: Event): String =

sbt — традиційний build tool для Scala.</syntaxhighlight>

Суть Scala 3 підходу: `given` і `using` роблять контекстні параметри більш явними й структурованими.
 event match {
val age: Int = 25

Функцію можна зберігати в змінній:

def describe(value: Any): String =
  • переносимість між платформами;
  • доступ до Java-бібліотек;
  • зрілу runtime-екосистему;
  • garbage collection;
  • tooling;
  • monitoring;
  • профілювання;
  • інтеграцію з enterprise-середовищем;
  • production-ready infrastructure. Scala — це сучасна статично типізована мова програмування. !== Given і using у Scala 3 ==

Functional programming

case class UserCreated(name: String) extends Event

Назва Scala походить від scalable language — мова, яка здатна масштабуватися від коротких скриптів до великих enterprise-систем.
  • новий синтаксис із optional braces;
  • `given` і `using` замість частини implicit-механізмів;
  • enums;
  • extension methods;
  • opaque types;
  • покращення type system;
  • нові функції ERP metaprogramming. Перевага collections: Scala дає можливість опрацьовувати колекції декларативно через `map`, `filter`, `fold`, `flatMap` та інші функції.

count = count + 1

через Практична роль: functional programming у Scala користувачі можуть писати передбачуваний, тестований і композиційний код.
  • персональні інформаційні дані;
  • logs;
  • event streams;
  • Spark datasets;
  • data lakes;
  • API payloads;
  • tokens;
  • credentials;
  • customer data;
  • encryption;
  • access control;
  • retention policies. Практична роль: Scala не ізольована від Java-світу — вона здатна використовувати Java-бібліотеки, JVM tooling і enterprise-інфраструктуру. Критерій

Приклад:

case 0 => "zero"

Extension methods дозволяють додавати методи до існуючих типів без зміни їхнього коду.SEO title: Scala — мова програмування для JVM, функціонального програмування, Akka, Spark і масштабованих систем

SEO keywords: Scala, мова програмування Scala, Scala programming language, JVM, functional programming, object-oriented programming, Scala 2, Scala 3, Dotty, sbt, Scala CLI, traits, case classes, pattern matching, collections, immutability, Futures, Akka, Apache Spark, Play Framework, Cats, ZIO, Typelevel, backend, big data, програмування

</noinclude>
 {{SEO
Шаблон для службового SEO-опису сторінки. 

}}


.filter(_ % 2 == 0)
.map(_ * 10)

println(result) </syntaxhighlight>

Доменна модель через case class

result match {

text.toIntOption match {

lazy val root = project </syntaxhighlight>

Try застосовується для для обгортання коду, який здатна кинути exception. Приклад взаємодії з Java:

val updatedUsers = users :+ "Carol" Порада: Try корисний на межах із Java API або кодом, який використовує exceptions. * Scala CLI Documentation. class MathTest extends AnyFunSuite {

Scala і Kotlin

Поширені помилки: Приклад: Scala здатна бути не найкращим вибором для:

Функції

'''Case class'''  одна з найпопулярніших конструкцій Scala. Scala має дві важливі гілки:

<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">

</div>
}
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
|-
| Платформа
| JVM
| JVM
|-
| Стиль
| ООП + FP
| Переважно ООП, із сучасними FP-елементами
|-
| Синтаксис
| Виразніший, компактніший
| Більш традиційний і явний
|-
| Type system
| Потужніший і складніший
| Простішій для більшості команд
|-
| ERP-платформа
| Scala + Java libraries
| Дуже велика Java-екосистема
|-
| Поріг входу
| Вищий
| Нижчий для enterprise-команд
|}

 case Some(age) => Right(age)
<syntaxhighlight lang="scala">
== sbt ==

</div>

== Traits ==

Приклад:
val sum = numbers.sum
== Scala 2 і Scala 3 ==
базовий фокус FP + OOP, type-level programming, data engineering Pragmatic JVM language, Android, backend
Складність Вища Нижча
Functional programming Дуже сильне Помірне
Android Не базовий напрям Один із головних напрямів
Big Data Сильна позиція через Spark Менш типова роль

Обмеження Scala

Практична роль: Scala CLI знижує поріг входу й робить Scala зручнішою для невеликих програм і швидких експериментів. * високий поріг входу;

  • складна type system;
  • різні стилі коду в екосистемі;
  • складність implicits у Scala 2;
  • час компіляції;
  • складність build tools;
  • менша кількість розробників, ніж у Java або Python;
  • складність onboarding;
  • ризик over-engineering;
  • складність деяких FP-абстракцій;
  • різниця між Scala 2 і Scala 3 в existing projects. * Cats Documentation. Scala виступає як важливою мовою для data engineering. case class User(name: String, age: Int)

def findUser(id: Long): Option [String] = Приклад із Option:

def main(args: Array [String]): Unit = {

! Java

case Right(value) => println(value)

Scala підтримує функціональне програмування. * factory methods;

  • apply methods;
  • validation;
  • serializers;
  • implicits або givens;
  • допоміжної логіки типу. * MUnit Documentation. .map(name => s"Found: $name")

import org.scalatest.funsuite.AnyFunSuite

extension (text: String)

val even = numbers.filter(_ % 2 == 0)

</syntaxhighlight>

  • `List`;
  • `Vector`;
  • `Array`;
  • `Map`;
  • `Set`;
  • `Seq`;
  • `LazyList`. val userName: Option [String] = Some("Alice")

object MathUtils {

Головна перевага в data engineering: Scala природно поєднується з Apache Spark і JVM-based data platforms. Підказка: типова сила Scala проявляється в комбінації case classes, pattern matching, immutable collections і типобезпечної обробки помилок.== Collections ==

Практична роль: Scala добре підходить для backend-систем, де важливі типобезпека, concurrency, JVM і складна доменна логіка.

Scala і Python часто зустрічаються в data engineering, особливо зі Spark. Приклад: val future = Future {

}

У Scala 2 механізм `implicit` використовувався для:

Правило: data pipeline на Scala має захищати інформаційні дані так само уважно, як production backend або аналітична платформа. println(user.copy(active = false)) критично: Scala найкраще розкривається в командах, які готові інвестувати в типобезпеку, функціональний стиль, якісну архітектуру й дисципліну коду.</syntaxhighlight>

  • `Some(value)`;
  • `None`. given defaultName: String = "Alice"
Головна перевага case class: вона ідеально підходить для опису даних, DTO, доменних моделей і immutable structures. Future у Scala представляє асинхронне обчислення.

Companion object часто застосовується для для:

Higher-order functions

val message = findUser(1)

log("Service started")

println(doubled)

  • backend services;
  • microservices;
  • distributed systems;
  • data engineering;
  • Apache Spark jobs;
  • stream processing;
  • REST API;
  • financial systems;
  • high-load systems;
  • event-driven architecture;
  • actor-based systems;
  • functional programming;
  • type-safe domain modeling;
  • data pipelines;
  • internal platforms. Cats надає:

val result = numbers Основна ідея: Scala поєднує виразність функціонального програмування з JVM-екосистемою, типобезпекою й можливістю використовувати Java-бібліотеки. Option застосовується для для значень, які можуть бути відсутні. def run(): Unit =

Суть прикладу: Scala здатна виглядати коротко й сучасно, але при цьому компілюється для JVM. Класичний стиль:

</syntaxhighlight> </syntaxhighlight>

import scala.util.Try
 case UserCreated(name) => s"Created: $name"

== Futures ==
 }
sbt застосовується для для:

}

val numbers = List(1, 2, 3)
  • actor systems;
  • distributed systems;
  • event-driven services;
  • streaming;
  • resilience;
  • message-driven architecture;
  • supervision;
  • concurrency. * Scala Documentation.

backend-розробки забезпечується через Scala застосовується для; так само реалізовано distributed systems, data engineering, big data, Apache Spark, stream processing, фінансових систем, високонавантажених сервісів, typed functional programming і складної бізнес-логіки.</syntaxhighlight>

case _ => "unknown"

println(result)

  • Apache Spark;
  • data engineering;
  • backend на JVM;
  • distributed systems;
  • event-driven systems;
  • financial systems;
  • typed business domains;
  • functional programming teams;
  • high-load backend;
  • complex domain logic;
  • teams із досвідом JVM і FP;
  • систем, де важлива compile-time safety.
     }
    Scala часто порівнюють із Java. enum Payment:
    <syntaxhighlight lang="scala">
    == Cats Effect ==
    
    '''object''' у Scala  це singleton object. val price: Double = 19.99
    
    * constructor;
    * `toString`;
    * `equals`;
    * `hashCode`;
    * `copy`;
    * pattern matching support;
    * зручну роботу з immutable data. import java.time.LocalDate
    
    Scala дає сильну типізацію, case classes, pattern matching, immutable collections, функції як значення, Java interoperability і доступ до потужної JVM-екосистеми. Приклад:
     40 + 2
    
    == Immutability ==
    '''Суть trait:''' trait здатна бути і контрактом, і частковою реалізацією поведінки.<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
    
    </div>
    
    </div>
     def log(message: String): Unit =
    
    val today = LocalDate.now()
    
    '''Практична роль:''' ScalaTest виступає як одним із найпоширеніших інструментів тестування в Scala-проєктах.== Змінні: val і var ==
    
    val userAge: Option [Int] = Some(25)
    '''Практична роль:''' Either дає можливість опрацьовувати помилки як значення, а не лише через exceptions.
    

Приклад:

Objects

Головна перевага immutability: immutable data спрощує reasoning, тестування й concurrent programming.
}

val result = findUser(1)

=== Обробка помилки через Either ===

println(multiply(2, 3))
<div style="background:#eef2ff; border-left:6px solid #4f46e5; padding:12px; margin:12px 0;">

<div style="background:#fff7ed; border-left:6px solid #fb923c; padding:12px; margin:12px 0;">

Scala 3 принесла:

Play Framework — web framework для Scala і Java.

Приклад:

}
  • використання `var` всюди;
  • використання `null` замість Option;
  • надмірне використання implicits;
  • складні types без потреби;
  • нерозуміння difference між `map` і `flatMap`;
  • неправильна робота з Future;
  • blocking у async-коді;
  • ігнорування ExecutionContext;
  • складний sbt build без потреби;
  • спроба писати Scala як Java;
  • надмірне використання inheritance;
  • відсутність тестів;
  • невиправданий over-engineering FP-абстракціями. Kotlin

class HomeController @Inject()(cc: ControllerComponents)

.getOrElse("User not found")

</syntaxhighlight>

MUnit — легкий testing framework, популярний у сучасній Scala-екосистемі. Простий приклад:

Практична роль: pattern matching дає можливість явно й безпечно опрацьовувати різні форми даних.== Хороші практики Scala ==

}
else Right(a / b)
* офіційний сайт Scala. |-
| Платформа
| JVM
| GHC runtime
|-
| Стиль
| ООП + FP
| Pure functional programming
|-
| Практичність enterprise
| Вища через JVM
| Менша в масовому enterprise
|-
| Чистота FP
| Компромісна
| Дуже сильна
|-
| ERP-платформа
| JVM + Scala
| Haskell ecosystem
|}

</div>
'''Практична роль:''' ZIO пропонує цілісний підхід до побудови функціональних Scala-застосунків із strongly typed effects. '''Висновок:''' sbt виступає як класичним вибором, Scala CLI зручний для старту, а Mill часто обирають як легшу альтернативу для build automation. println(user.copy(age = 26))

Окремо варто відзначити яка функціонує на JVM і поєднує обєктно-орієнтоване і функціональне програмування. Критерій

 case Some(name) => println(s"Found: $name")

 if id == 1 then Some("Alice") else None
== Option ==
== Object-oriented programming ==

'''Висновок:''' Scala часто обирають як практичний баланс між FP-ідеями й JVM-production, а Haskell  для чистішого функціонального підходу.== Типи даних ==

'''Висновок:''' Python зручніший для data science і прототипів, а Scala сильніша для типізованих JVM/Spark production pipelines. Python
Traits використовуються для:

<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">

<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">

через JVM Scala отримує:

* immutability;
* pure functions;
* referential transparency;
* higher-order functions;
* algebraic data types;
* pattern matching;
* type classes;
* error handling through types;
* composition;
* effects. object User {

== Scala і Python ==

 }

val multiply: (Int, Int) => Int = (a, b) => a * b

Основні ідеї:
'''Either''' застосовується для для результату, який здатна бути успішним або помилковим. '''Суть функцій у Scala:''' функції можна передавати, повертати, зберігати й комбінувати як звичайні значення. '''Scala'''  це статично типізована JVM-мова, яка поєднує функціональне й обєктно-орієнтоване програмування. Scala часто використовують як практичну FP-мову на JVM, а Haskell  як чистішу функціональну мову. Потрібно контролювати:

* швидкість;
* зрозуміліший build definition;
* підтримку multi-module projects;
* простішу модель задач;
* інтеграцію з Scala і Java.<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">
</div>
val doubled = numbers.map(_ * 2)

</div>

Приклад:

val result = add(2, 3)

'''Головна думка:''' Scala  це потужна мова для типобезпечних JVM-систем, big data й функціонального backend, але її ефективність залежить від зрілої команди, простого стилю й розумного використання абстракцій. * ScalaTest Documentation.<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">

'''Higher-order function'''  це функція, яка приймає іншу функцію або повертає функцію.<syntaxhighlight lang="scala">
divide(10, 2) match {
Можливі складнощі:

 if id == 1 then Some("Alice") else None

Функції в Scala виступає як first-class values. if b == 0 then Left("Division by zero")
Scala дає можливість писати код у різних стилях:
 case n: Int => s"number: $n"
У Scala зазвичай рекомендується використовувати `val`, якщо змінність не потрібна. * sbt Documentation. Scala добре підходить для:
'''Trait'''  це спосіб описати спільну поведінку або контракт. def add(a: Int, b: Int): Int =
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">

</div>

* [[Програмування]]
* [[Мова програмування]]
* [[Java]]
* [[Kotlin]]
* [[Python]]
* [[Haskell]]
* [[JVM]]
* [[Functional programming]]
* [[Object-oriented programming]]
* [[Apache Spark]]
* [[Akka]]
* [[Play Framework]]
* [[sbt]]
* [[Scala CLI]]
* [[Cats]]
* [[ZIO]]
* [[Backend]]
* [[Data Engineering]]
* [[Big Data]]
* [[Machine Learning]]
* [[Налагодження коду]]
* [[Логування]]
* [[Безпека застосунків]]

Scala часто застосовується для в data engineering і backend, тому приватність важлива. Scala має статичну типізацію, але часто здатна виводити типи автоматизовано. * Apache Spark Documentation.

Приклад:

Scala і Java

!

== Case classes ==
val result = data
Spark написаний на Scala й має природну підтримку Scala API. Типові сценарії:
'''Cats'''  бібліотека для функціонального програмування в Scala. * Scala 3 Book.<div style="background:#eef2ff; border-left:6px solid #4f46e5; padding:12px; margin:12px 0;">

<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">

}

{| class="wikitable"
'''Помилка:''' використовувати всі складні функції ERP Scala без потреби. Scala 3 замінює частину implicit-механізмів більш явними `given` і `using`. '''Висновок:''' Scala дає більше виразності й FP-можливостей, а Java часто простіша для масових enterprise-команд і має ширшу кадрову базу. val status = Status.Active

</div>
== Типові помилки початківців ==
<syntaxhighlight lang="scala">
Приклад:
|-
| Типізація
| Статична
| Динамічна
|-
| Spark
| Нативна мова Spark
| Дуже популярна через PySpark
|-
| Швидкість розробки
| Вища дисципліна, більше типів
| Швидке прототипування
|-
| Production data pipelines
| Сильна типобезпека
| Простота й широка data science ERP-платформа
|-
| AI / ML
| Менша ERP-платформа
| Дуже сильна ERP-платформа
|}

Вона застосовується для для:

</syntaxhighlight>

println(sum)

Можливі стеки: Приклад із List: var count = 0 Головна перевага: Scala дає можливість будувати складні типізовані системи на JVM із виразним функціональним і об’єктним кодом. Її сила — у поєднанні обох підходів, але це так само здатна ускладнювати стиль коду в команді. !</syntaxhighlight>

val description =

val result = Try("123".toInt) val user = User("Alice", 25) Приклад: </syntaxhighlight> val user = User("Alice", 25)

</div>
 name <- userName
 age <- userAge
 yield s"$name is $age"

println(description)

</syntaxhighlight>

def create(name: String): User =
  • `val` — незмінне значення;
  • `var` — змінна, яку можна змінювати.

Обробка списку

a + b
Ok("Hello from Play")
case Cash
  • використовувати `val` замість `var`;
  • моделювати домен через case classes;
  • використовувати Option замість null;
  • не зловживати implicits;
  • у Scala 3 використовувати given/using обережно;
  • писати маленькі функції;
  • уникати over-engineering;
  • обирати один стиль у команді;
  • покривати код тестами;
  • використовувати formatter;
  • контролювати dependencies;
  • писати зрозумілі типи для public API;
  • не приховувати бізнес-логіку в складних абстракціях;
  • документувати non-obvious FP code.
def index = Action {
.settings(
s"Hello, $name"
value match {
Scala 3 підтримує extension methods. Водночас Scala має вищий поріг входу, складнішу type system і потребує узгодженого стилю в команді.
 assertEquals(2 + 3, 5)
<syntaxhighlight lang="scala">

</div>

Приклад:

Приклад `build.sbt`:

* web applications;
* REST API;
* reactive services;
* backend systems;
* MVC applications;
* asynchronous web apps. застосовується для для:

'''Суть higher-order functions:''' поведінку можна передавати як аргумент, що робить код гнучким і композиційним. def divide(a: Int, b: Int): Either [String, Int] =

</div>
</div>
'''Практична порада:''' нові проєкти варто розглядати на Scala 3, але в existing systems часто ще зустрічається Scala 2 через велику legacy-екосистему. * `Int`;
* `Long`;
* `Double`;
* `Float`;
* `Boolean`;
* `Char`;
* `String`;
* `Unit`;
* `Option`;
* `List`;
* `Vector`;
* `Map`;
* `Set`. trait Logger {

println(result)

* `Success(value)`;
* `Failure(exception)`. println(MathUtils.add(2, 3))

</div>

val name = "Alice"

println("Hello, world!")
 s"Hello, $name"

'''Scala CLI'''  сучасний інструмент для запуску, компіляції, тестування й scripting у Scala. * Scala 2 Documentation. ! Або коротше:

 assert(2 + 3 == 5)

import scala.concurrent.Future

 def exclaim: String = text + "!"
sealed trait Event

'''Mill'''  альтернативний build tool для Scala.
scala-cli run Hello.scala

Приклад:
val name: String = "Alice"

== MUnit ==
Приклад:

<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
! Оригінальний список не змінюється, а створюється новий. '''Практична роль:''' класи використовуються для опису доменних сутностей, сервісів, конфігурацій і бізнес-обєктів. Scala 3 має зручні enums. case Card(number: String)

Приклад:
У Scala виступає як два основні способи оголошення змінних:
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
'''критично:''' Future запускається eager-стилем, тому для складніших functional effect systems часто використовують Cats Effect або ZIO. `Try` здатна бути:
result.show()
 .filter($"age" > 18)

'''Суть object:''' Scala має вбудований спосіб створювати singleton без статичних методів у стилі Java. * Cats Effect Documentation.== For-comprehension ==

<syntaxhighlight lang="scala">

Приклад:

'''Companion object'''  це object із такою самою назвою, як клас, у тому самому файлі.== Джерела ==

* type classes;
* functional abstractions;
* data types;
* syntax extensions;
* Either helpers;
* Validated;
* Semigroup;
* Monoid;
* Functor;
* Applicative;
* Monad. Приклад:
'''Akka'''  toolkit для concurrent, distributed і actor-based systems у Scala та Java.== Загальний SEO-опис ==
</div>

== Companion object ==

println(result)

* '''Scala 2'''  довго була основною версією мови, на ній побудовано багато production-проєктів;
* '''Scala 3'''  новіша реліз системи мови, так само відома як Dotty під час розробки, із покращеннями синтаксису, типів і metaprogramming. for n <- numbers
 yield n * 2

println(result)
  • Apache Spark;
  • ETL;
  • streaming;
  • distributed processing;
  • typed transformations;
  • data validation;
  • big data pipelines;
  • data lake processing;
  • batch jobs. }
case UserBlocked(name) => s"Blocked: $name"

Pattern matching

Scala CLI

a + b
Увага: implicits дуже потужні, але надмірне або неочевидне використання здатна ускладнювати читання й debugging.
* interfaces;
* shared behavior;
* mixins;
* dependency abstraction;
* type classes;
* composition. version := "0.1.0"
'''Pattern matching'''  одна з ключових можливостей Scala.<syntaxhighlight lang="scala">

<syntaxhighlight lang="scala">

* обєктно-орієнтованому;
* функціональному;
* імперативному;
* declarative;
* reactive;
* actor-based;
* data processing;
* type-driven design. * ZIO Documentation. println(user.name)
<div style="background:#fef2f2; border-left:6px solid #ef4444; padding:12px; margin:12px 0;">

<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
future.foreach(result => println(result))

val result =
println(user.greet())

! * classes;
* objects;
* traits;
* inheritance;
* composition;
* encapsulation;
* polymorphism;
* abstract classes. val price = 19.99
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
println(updatedUsers)

</div>

'''критично:''' Option робить відсутність значення явною частиною типу, тому код менше покладається на небезпечний `null`. val active = true
== Scala і Haskell ==

case class User(name: String, age: Int)

</div>
val users = List("Alice", "Bob")
== Apache Spark ==
for
case Left(error) => println(error)

object Main { </syntaxhighlight>

Apache Spark — одна з головних причин популярності Scala у data engineering.

Основні конкурентні переваги Scala:

Безпечний пошук через Option

<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">
=== Pattern matching із case class ===
}

</div>
<div style="background:#fdecea; border-left:6px solid #e74c3c; padding:12px; margin:12px 0;">

case class UserBlocked(name: String) extends Event

* utility methods;
* entry points;
* companion objects;
* factories;
* configuration;
* singleton services.</div>

println("Hello".exclaim)
<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">
== Перша програма на Scala ==
}

'''критично:''' Scala дає велику силу, але потребує зрілої інженерної культури й узгодженого стилю в команді. Scala
 User(name)

Приклад:

 println("Hello, world!")

== Backend development ==

}
== Класи ==
== Data engineering ==
== Akka ==

def greet(user: User): String =

Enum із даними:

<syntaxhighlight lang="scala">

Приклад: class User(val name: String) val user = User(1, "Alice", active = true)

Scala компілюється в bytecode для JVM, тому здатна взаємодіяти з Java-кодом і використовувати велику кількість Java-бібліотек. Pattern matching добре функціонує з case classes: val user = User.create("Alice")

val result = applyTwice(3, _ + 1)

Play Framework

Критично: типобезпека Scala не замінює security review.== Enums у Scala 3 ==

Суть Cats Effect: side effects не виконуються хаотично, а описуються як контрольовані значення, які можна комбінувати й запускати. println(describe(UserCreated("Alice"))) <syntaxhighlight lang="scala">

}
)

Коли варто використовувати Scala

Cats Effect — бібліотека для functional effect systems у Scala. case None => println("Not found") Scala заохочує immutable data. Практична роль: Scala виступає як однією з ключових мов для Apache Spark і big data workflows. * Scala