Scala
Scala — це сучасна статично типізована мова програмування, яка працює на JVM і поєднує об’єктно-орієнтоване та функціональне програмування.
Scala використовується для backend-розробки, distributed systems, data engineering, big data, Apache Spark, stream processing, фінансових систем, високонавантажених сервісів, typed functional programming і складної бізнес-логіки.
Основна ідея: Scala поєднує виразність функціонального програмування з JVM-екосистемою, типобезпекою й можливістю використовувати Java-бібліотеки.
Загальний опис
Назва Scala походить від scalable language — мова, яка може масштабуватися від коротких скриптів до великих enterprise-систем.
Scala дозволяє писати код у різних стилях:
- об’єктно-орієнтованому;
- функціональному;
- імперативному;
- declarative;
- reactive;
- actor-based;
- data processing;
- type-driven design.
Scala компілюється в bytecode для JVM, тому може взаємодіяти з Java-кодом і використовувати велику кількість Java-бібліотек.
Перевага: Scala дає доступ до зрілої JVM-екосистеми, але дозволяє писати коротший, виразніший і часто більш типобезпечний код, ніж класична Java.
Для чого використовується Scala
Scala використовується у різних типах проєктів.
Типові сценарії:
- 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.
Важливо: Scala найкраще розкривається в командах, які готові інвестувати в типобезпеку, функціональний стиль, якісну архітектуру й дисципліну коду.
JVM
JVM або Java Virtual Machine — це середовище виконання, на якому працює Scala.
Завдяки JVM Scala отримує:
- переносимість між платформами;
- доступ до Java-бібліотек;
- зрілу runtime-екосистему;
- garbage collection;
- tooling;
- monitoring;
- профілювання;
- інтеграцію з enterprise-середовищем;
- production-ready infrastructure.
Приклад взаємодії з Java:
import java.time.LocalDate
val today = LocalDate.now()
println(today)
Практична роль: Scala не ізольована від Java-світу — вона може використовувати Java-бібліотеки, JVM tooling і enterprise-інфраструктуру.
Scala 2 і Scala 3
Scala має дві важливі гілки:
- Scala 2 — довго була основною версією мови, на ній побудовано багато production-проєктів;
- Scala 3 — новіша версія мови, також відома як Dotty під час розробки, із покращеннями синтаксису, типів і metaprogramming.
Scala 3 принесла:
- новий синтаксис із optional braces;
- `given` і `using` замість частини implicit-механізмів;
- enums;
- extension methods;
- opaque types;
- покращення type system;
- нові можливості metaprogramming.
Практична порада: нові проєкти варто розглядати на Scala 3, але в existing systems часто ще зустрічається Scala 2 через велику legacy-екосистему.
Перша програма на Scala
Простий приклад:
@main def hello(): Unit =
println("Hello, world!")
Класичний стиль:
object Main {
def main(args: Array[String]): Unit = {
println("Hello, world!")
}
}
Суть прикладу: Scala може виглядати коротко й сучасно, але при цьому компілюється для JVM.
Змінні: val і var
У Scala є два основні способи оголошення змінних:
- `val` — незмінне значення;
- `var` — змінна, яку можна змінювати.
Приклад:
val name = "Alice"
var count = 0
count = count + 1
У Scala зазвичай рекомендується використовувати `val`, якщо змінність не потрібна.
Головне правило: у Scala краще починати з `val`, а `var` використовувати лише там, де змінність справді потрібна.
Типи даних
Scala має статичну типізацію, але часто може виводити типи автоматично.
Приклад:
val age: Int = 25
val price: Double = 19.99
val name: String = "Alice"
val active: Boolean = true
Або коротше:
val age = 25
val price = 19.99
val name = "Alice"
val active = true
Основні типи:
- `Int`;
- `Long`;
- `Double`;
- `Float`;
- `Boolean`;
- `Char`;
- `String`;
- `Unit`;
- `Option`;
- `List`;
- `Vector`;
- `Map`;
- `Set`.
Практична роль: Scala поєднує типобезпеку з type inference, тому код може бути коротким без втрати перевірок компілятора.
Функції
Функції в Scala є first-class values.
Приклад:
def add(a: Int, b: Int): Int =
a + b
val result = add(2, 3)
println(result)
Функцію можна зберігати в змінній:
val multiply: (Int, Int) => Int = (a, b) => a * b
println(multiply(2, 3))
Суть функцій у Scala: функції можна передавати, повертати, зберігати й комбінувати як звичайні значення.
Класи
Scala підтримує класи й об’єктно-орієнтоване програмування.
Приклад:
class User(val name: String, val age: Int) {
def greet(): String =
s"Hello, $name"
}
val user = User("Alice", 25)
println(user.greet())
У Scala 3 створення об’єкта класу часто може не вимагати `new`.
Практична роль: класи використовуються для опису доменних сутностей, сервісів, конфігурацій і бізнес-об’єктів.
Objects
object у Scala — це singleton object.
Приклад:
object MathUtils {
def add(a: Int, b: Int): Int =
a + b
}
println(MathUtils.add(2, 3))
Objects використовуються для:
- utility methods;
- entry points;
- companion objects;
- factories;
- configuration;
- singleton services.
Суть object: Scala має вбудований спосіб створювати singleton без статичних методів у стилі Java.
Companion object
Companion object — це object із такою самою назвою, як клас, у тому самому файлі.
Приклад:
class User(val name: String)
object User {
def create(name: String): User =
User(name)
}
val user = User.create("Alice")
Companion object часто використовується для:
- factory methods;
- apply methods;
- validation;
- serializers;
- implicits або givens;
- допоміжної логіки типу.
Практична роль: companion object дозволяє зберігати логіку, пов’язану з типом, але не прив’язану до конкретного екземпляра.
Case classes
Case class — одна з найпопулярніших конструкцій Scala.
Приклад:
case class User(name: String, age: Int)
val user = User("Alice", 25)
println(user.name)
println(user.copy(age = 26))
Case classes автоматично дають:
- constructor;
- `toString`;
- `equals`;
- `hashCode`;
- `copy`;
- pattern matching support;
- зручну роботу з immutable data.
Головна перевага case class: вона ідеально підходить для опису даних, DTO, доменних моделей і immutable structures.
Traits
Trait — це спосіб описати спільну поведінку або контракт.
Приклад:
trait Logger {
def log(message: String): Unit =
println(s"[LOG] $message")
}
class Service extends Logger {
def run(): Unit =
log("Service started")
}
Traits використовуються для:
- interfaces;
- shared behavior;
- mixins;
- dependency abstraction;
- type classes;
- composition.
Суть trait: trait може бути і контрактом, і частковою реалізацією поведінки.
Pattern matching
Pattern matching — одна з ключових можливостей Scala.
Приклад:
def describe(value: Any): String =
value match {
case 0 => "zero"
case n: Int => s"number: $n"
case s: String => s"text: $s"
case _ => "unknown"
}
Pattern matching добре працює з case classes:
case class User(name: String, age: Int)
def greet(user: User): String =
user match {
case User(name, age) if age >= 18 => s"Hello, adult $name"
case User(name, _) => s"Hello, $name"
}
Практична роль: pattern matching дозволяє явно й безпечно обробляти різні форми даних.
Option
Option використовується для значень, які можуть бути відсутні.
Замість `null` у Scala часто використовують:
- `Some(value)`;
- `None`.
Приклад:
def findUser(id: Int): Option[String] =
if id == 1 then Some("Alice") else None
val result = findUser(1)
result match {
case Some(name) => println(s"Found: $name")
case None => println("Not found")
}
Важливо: Option робить відсутність значення явною частиною типу, тому код менше покладається на небезпечний `null`.
Either
Either використовується для результату, який може бути успішним або помилковим.
Приклад:
def divide(a: Int, b: Int): Either[String, Int] =
if b == 0 then Left("Division by zero")
else Right(a / b)
divide(10, 2) match {
case Right(value) => println(value)
case Left(error) => println(error)
}
Зазвичай:
- `Right` — успіх;
- `Left` — помилка.
Практична роль: Either дозволяє обробляти помилки як значення, а не лише через exceptions.
Try
Try використовується для обгортання коду, який може кинути exception.
Приклад:
import scala.util.Try
val result = Try("123".toInt)
println(result)
`Try` може бути:
- `Success(value)`;
- `Failure(exception)`.
Порада: Try корисний на межах із Java API або кодом, який використовує exceptions.
Collections
Scala має сильну екосистему collections.
Поширені колекції:
- `List`;
- `Vector`;
- `Array`;
- `Map`;
- `Set`;
- `Seq`;
- `LazyList`.
Приклад:
val numbers = List(1, 2, 3, 4, 5)
val doubled = numbers.map(_ * 2)
val even = numbers.filter(_ % 2 == 0)
val sum = numbers.sum
println(doubled)
println(even)
println(sum)
Перевага collections: Scala дозволяє обробляти колекції декларативно через `map`, `filter`, `fold`, `flatMap` та інші функції.
Immutability
Scala заохочує immutable data.
Приклад:
val users = List("Alice", "Bob")
val updatedUsers = users :+ "Carol"
println(users)
println(updatedUsers)
Оригінальний список не змінюється, а створюється новий.
Головна перевага immutability: immutable data спрощує reasoning, тестування й concurrent programming.
For-comprehension
For-comprehension — зручний синтаксис для роботи з колекціями, Option, Either, Future та іншими типами.
Приклад із List:
val numbers = List(1, 2, 3)
val result =
for n <- numbers
yield n * 2
println(result)
Приклад із Option:
val userName: Option[String] = Some("Alice")
val userAge: Option[Int] = Some(25)
val description =
for
name <- userName
age <- userAge
yield s"$name is $age"
println(description)
Практична роль: for-comprehension робить послідовність операцій читабельнішою, особливо коли кожен крок повертає wrapper type.
Higher-order functions
Higher-order function — це функція, яка приймає іншу функцію або повертає функцію.
Приклад:
def applyTwice(x: Int, f: Int => Int): Int =
f(f(x))
val result = applyTwice(3, _ + 1)
println(result)
Суть higher-order functions: поведінку можна передавати як аргумент, що робить код гнучким і композиційним.
Functional programming
Scala підтримує функціональне програмування.
Основні ідеї:
- immutability;
- pure functions;
- referential transparency;
- higher-order functions;
- algebraic data types;
- pattern matching;
- type classes;
- error handling through types;
- composition;
- effects.
Практична роль: functional programming у Scala допомагає писати передбачуваний, тестований і композиційний код.
Object-oriented programming
Scala також є об’єктно-орієнтованою мовою.
Вона підтримує:
- classes;
- objects;
- traits;
- inheritance;
- composition;
- encapsulation;
- polymorphism;
- abstract classes.
Важливо: Scala не змушує обирати лише ООП або FP. Її сила — у поєднанні обох підходів, але це також може ускладнювати стиль коду в команді.
Implicits у Scala 2
У Scala 2 механізм `implicit` використовувався для:
- implicit parameters;
- implicit conversions;
- extension-like methods;
- type classes;
- context passing.
Приклад:
implicit val defaultName: String = "Alice"
def greet(implicit name: String): String =
s"Hello, $name"
println(greet)
Увага: implicits дуже потужні, але надмірне або неочевидне використання може ускладнювати читання й debugging.
Given і using у Scala 3
Scala 3 замінює частину implicit-механізмів більш явними `given` і `using`.
Приклад:
given defaultName: String = "Alice"
def greet(using name: String): String =
s"Hello, $name"
println(greet)
Суть Scala 3 підходу: `given` і `using` роблять контекстні параметри більш явними й структурованими.
Extension methods
Scala 3 підтримує extension methods.
Приклад:
extension (text: String)
def exclaim: String = text + "!"
println("Hello".exclaim)
Extension methods дозволяють додавати методи до існуючих типів без зміни їхнього коду.
Практична роль: extension methods роблять API зручнішим і типобезпечнішим, особливо в бібліотеках.
Enums у Scala 3
Scala 3 має зручні enums.
Приклад:
enum Status:
case New, Active, Blocked
val status = Status.Active
Enum із даними:
enum Payment:
case Cash
case Card(number: String)
Практична роль: enums у Scala 3 зручні для моделювання станів, подій, типів повідомлень і доменних варіантів.
sbt
sbt — традиційний build tool для Scala.
sbt використовується для:
- збірки проєктів;
- керування залежностями;
- запуску тестів;
- multi-module projects;
- publishing;
- інтеграції з JVM;
- запуску Scala applications.
Приклад `build.sbt`:
ThisBuild / scalaVersion := "3.3.1"
lazy val root = project
.in(file("."))
.settings(
name := "my-scala-app",
version := "0.1.0"
)
Важливо: sbt дуже потужний, але може бути складним для новачків через власну модель налаштувань і DSL.
Scala CLI
Scala CLI — сучасний інструмент для запуску, компіляції, тестування й scripting у Scala.
Приклад:
scala-cli run Hello.scala
Scala CLI корисний для:
- навчання;
- швидких скриптів;
- невеликих проєктів;
- запуску single-file programs;
- experiments;
- простішого старту зі Scala.
Практична роль: Scala CLI знижує поріг входу й робить Scala зручнішою для невеликих програм і швидких експериментів.
Mill
Mill — альтернативний build tool для Scala.
Mill часто цінують за:
- швидкість;
- зрозуміліший build definition;
- підтримку multi-module projects;
- простішу модель задач;
- інтеграцію з Scala і Java.
Висновок: sbt є класичним вибором, Scala CLI зручний для старту, а Mill часто обирають як легшу альтернативу для build automation.
Apache Spark
Apache Spark — одна з головних причин популярності Scala у data engineering.
Spark написаний на Scala й має природну підтримку Scala API.
Scala використовується в Spark для:
- batch processing;
- distributed data processing;
- ETL;
- data pipelines;
- streaming;
- machine learning pipelines;
- big data transformations;
- typed Dataset API.
Приклад:
val data = spark.read.json("data.json")
val result = data
.filter($"age" > 18)
.groupBy("country")
.count()
result.show()
Практична роль: Scala є однією з ключових мов для Apache Spark і big data workflows.
Akka
Akka — toolkit для concurrent, distributed і actor-based systems у Scala та Java.
Akka використовується для:
- actor systems;
- distributed systems;
- event-driven services;
- streaming;
- resilience;
- message-driven architecture;
- supervision;
- concurrency.
Увага: Akka дає потужну модель actor-based systems, але потребує розуміння concurrency, message passing і failure handling.
Play Framework
Play Framework — web framework для Scala і Java.
Play використовується для:
- web applications;
- REST API;
- reactive services;
- backend systems;
- MVC applications;
- asynchronous web apps.
Приклад напряму:
class HomeController @Inject()(cc: ControllerComponents)
extends AbstractController(cc) {
def index = Action {
Ok("Hello from Play")
}
}
Практична роль: Play був одним із важливих web frameworks у Scala-екосистемі для backend і API.
Cats
Cats — бібліотека для функціонального програмування в Scala.
Cats надає:
- type classes;
- functional abstractions;
- data types;
- syntax extensions;
- Either helpers;
- Validated;
- Semigroup;
- Monoid;
- Functor;
- Applicative;
- Monad.
Практична роль: Cats допомагає будувати функціональний Scala-код на основі формальних абстракцій і композиції.
Cats Effect
Cats Effect — бібліотека для functional effect systems у Scala.
Вона використовується для:
- опису effects як значень;
- async programming;
- resource safety;
- concurrency;
- cancellation;
- functional services;
- pure FP architecture.
Суть Cats Effect: side effects не виконуються хаотично, а описуються як контрольовані значення, які можна комбінувати й запускати.
ZIO
ZIO — функціональна Scala-екосистема для asynchronous, concurrent і resilient applications.
ZIO використовується для:
- effect management;
- typed errors;
- concurrency;
- resource safety;
- dependency injection;
- streams;
- testing;
- backend services.
Практична роль: ZIO пропонує цілісний підхід до побудови функціональних Scala-застосунків із strongly typed effects.
Futures
Future у Scala представляє асинхронне обчислення.
Приклад:
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
val future = Future {
40 + 2
}
future.foreach(result => println(result))
Futures використовуються для:
- async operations;
- network calls;
- parallel computation;
- non-blocking APIs;
- backend services.
Важливо: Future запускається eager-стилем, тому для складніших functional effect systems часто використовують Cats Effect або ZIO.
ScalaTest
ScalaTest — популярний testing framework для Scala.
Приклад:
import org.scalatest.funsuite.AnyFunSuite
class MathTest extends AnyFunSuite {
test("addition works") {
assert(2 + 3 == 5)
}
}
ScalaTest використовується для:
- unit tests;
- integration tests;
- behavior-style tests;
- testing JVM applications;
- Spark testing;
- backend testing.
Практична роль: ScalaTest є одним із найпоширеніших інструментів тестування в Scala-проєктах.
MUnit
MUnit — легкий testing framework, популярний у сучасній Scala-екосистемі.
Приклад:
class MathSuite extends munit.FunSuite {
test("addition") {
assertEquals(2 + 3, 5)
}
}
Практична роль: MUnit часто обирають для простого, швидкого й сучасного тестування Scala-коду.
Backend development
Scala використовується для backend-розробки.
Можливі стеки:
- Akka HTTP;
- Play Framework;
- http4s;
- ZIO HTTP;
- Tapir;
- Finagle;
- Cats Effect;
- ZIO;
- Doobie;
- Slick;
- Quill.
Типові задачі:
- REST API;
- microservices;
- event-driven systems;
- streaming services;
- financial backends;
- integration services;
- high-load systems;
- data APIs.
Практична роль: Scala добре підходить для backend-систем, де важливі типобезпека, concurrency, JVM і складна доменна логіка.
Data engineering
Scala є важливою мовою для data engineering.
Використовується для:
- Apache Spark;
- ETL;
- streaming;
- distributed processing;
- typed transformations;
- data validation;
- big data pipelines;
- data lake processing;
- batch jobs.
Головна перевага в data engineering: Scala природно поєднується з Apache Spark і JVM-based data platforms.
Scala і Java
Scala часто порівнюють із Java.
| Критерій | Scala | Java |
|---|---|---|
| Платформа | JVM | JVM |
| Стиль | ООП + FP | Переважно ООП, із сучасними FP-елементами |
| Синтаксис | Виразніший, компактніший | Більш традиційний і явний |
| Type system | Потужніший і складніший | Простішій для більшості команд |
| Екосистема | Scala + Java libraries | Дуже велика Java-екосистема |
| Поріг входу | Вищий | Нижчий для enterprise-команд |
Висновок: Scala дає більше виразності й FP-можливостей, а Java часто простіша для масових enterprise-команд і має ширшу кадрову базу.
Scala і Kotlin
Scala і Kotlin обидві працюють на JVM, але мають різний фокус.
| Критерій | Scala | Kotlin |
|---|---|---|
| Основний фокус | FP + OOP, type-level programming, data engineering | Pragmatic JVM language, Android, backend |
| Складність | Вища | Нижча |
| Functional programming | Дуже сильне | Помірне |
| Android | Не основний напрям | Один із головних напрямів |
| Big Data | Сильна позиція через Spark | Менш типова роль |
Висновок: Kotlin часто є практичнішою заміною Java, а Scala — мовою для глибшого FP, типобезпеки й data engineering.
Scala і Python
Scala і Python часто зустрічаються в data engineering, особливо зі Spark.
| Критерій | Scala | Python |
|---|---|---|
| Типізація | Статична | Динамічна |
| Spark | Нативна мова Spark | Дуже популярна через PySpark |
| Швидкість розробки | Вища дисципліна, більше типів | Швидке прототипування |
| Production data pipelines | Сильна типобезпека | Простота й широка data science екосистема |
| AI / ML | Менша екосистема | Дуже сильна екосистема |
Висновок: Python зручніший для data science і прототипів, а Scala сильніша для типізованих JVM/Spark production pipelines.
Scala і Haskell
Scala часто використовують як практичну FP-мову на JVM, а Haskell — як чистішу функціональну мову.
| Критерій | Scala | Haskell |
|---|---|---|
| Платформа | JVM | GHC runtime |
| Стиль | ООП + FP | Pure functional programming |
| Практичність enterprise | Вища через JVM | Менша в масовому enterprise |
| Чистота FP | Компромісна | Дуже сильна |
| Екосистема | JVM + Scala | Haskell ecosystem |
Висновок: Scala часто обирають як практичний баланс між FP-ідеями й JVM-production, а Haskell — для чистішого функціонального підходу.
Переваги Scala
Основні переваги Scala:
- 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.
Головна перевага: Scala дозволяє будувати складні типізовані системи на JVM із виразним функціональним і об’єктним кодом.
Обмеження Scala
Scala має обмеження.
Можливі складнощі:
- високий поріг входу;
- складна type system;
- різні стилі коду в екосистемі;
- складність implicits у Scala 2;
- час компіляції;
- складність build tools;
- менша кількість розробників, ніж у Java або Python;
- складність onboarding;
- ризик over-engineering;
- складність деяких FP-абстракцій;
- різниця між Scala 2 і Scala 3 в existing projects.
Помилка: використовувати всі складні можливості Scala без потреби. Надмірна абстракція може зробити код важким для команди.
Коли варто використовувати Scala
Scala добре підходить для:
- 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 варто обирати, коли команда цінує типобезпеку, функціональний стиль і JVM-інфраструктуру.
Коли Scala може бути невдалим вибором
Scala може бути не найкращим вибором для:
- дуже простих CRUD-застосунків;
- команд без JVM-досвіду;
- команд без часу на навчання FP;
- швидких прототипів;
- mobile development;
- embedded;
- сценаріїв, де Python або Java достатні й простіші;
- проєктів із високою плинністю junior-розробників;
- систем, де складна type system буде більше заважати, ніж допомагати.
Важливо: Scala дає велику силу, але потребує зрілої інженерної культури й узгодженого стилю в команді.
Безпека Scala-застосунків
Scala-застосунки мають звичайні security-ризики JVM і backend-систем.
Потрібно контролювати:
- 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.
Критично: типобезпека Scala не замінює security review. Вона допомагає з частиною помилок, але не захищає автоматично від поганої авторизації, витоків даних або небезпечних залежностей.
Приватність даних
Scala часто використовується в data engineering і backend, тому приватність важлива.
Потрібно контролювати:
- персональні дані;
- logs;
- event streams;
- Spark datasets;
- data lakes;
- API payloads;
- tokens;
- credentials;
- customer data;
- encryption;
- access control;
- retention policies.
Правило: data pipeline на Scala має захищати дані так само уважно, як production backend або аналітична платформа.
Хороші практики Scala
Рекомендовано:
- використовувати `val` замість `var`;
- моделювати домен через case classes;
- використовувати Option замість null;
- не зловживати implicits;
- у Scala 3 використовувати given/using обережно;
- писати маленькі функції;
- уникати over-engineering;
- обирати один стиль у команді;
- покривати код тестами;
- використовувати formatter;
- контролювати dependencies;
- писати зрозумілі типи для public API;
- не приховувати бізнес-логіку в складних абстракціях;
- документувати non-obvious FP code.
Головне правило: хороший Scala-код має бути типобезпечним, композиційним і зрозумілим для команди, а не просто максимально “розумним”.
Типові помилки початківців
Поширені помилки:
- використання `var` всюди;
- використання `null` замість Option;
- надмірне використання implicits;
- складні types без потреби;
- нерозуміння difference між `map` і `flatMap`;
- неправильна робота з Future;
- blocking у async-коді;
- ігнорування ExecutionContext;
- складний sbt build без потреби;
- спроба писати Scala як Java;
- надмірне використання inheritance;
- відсутність тестів;
- невиправданий over-engineering FP-абстракціями.
Небезпека: Scala дозволяє писати дуже абстрактний код, але якщо команда його не розуміє, підтримка системи стає дорожчою.
Приклади задач на Scala
Обробка списку
val numbers = List(1, 2, 3, 4, 5)
val result = numbers
.filter(_ % 2 == 0)
.map(_ * 10)
println(result)
Доменна модель через case class
case class User(id: Long, name: String, active: Boolean)
val user = User(1, "Alice", active = true)
println(user.copy(active = false))
Безпечний пошук через Option
def findUser(id: Long): Option[String] =
if id == 1 then Some("Alice") else None
val message = findUser(1)
.map(name => s"Found: $name")
.getOrElse("User not found")
println(message)
Обробка помилки через Either
def parseAge(text: String): Either[String, Int] =
text.toIntOption match {
case Some(age) => Right(age)
case None => Left("Invalid age")
}
println(parseAge("25"))
println(parseAge("abc"))
Pattern matching із case class
sealed trait Event
case class UserCreated(name: String) extends Event
case class UserBlocked(name: String) extends Event
def describe(event: Event): String =
event match {
case UserCreated(name) => s"Created: $name"
case UserBlocked(name) => s"Blocked: $name"
}
println(describe(UserCreated("Alice")))
Підказка: типова сила Scala проявляється в комбінації case classes, pattern matching, immutable collections і типобезпечної обробки помилок.
Джерела
- Офіційний сайт Scala.
- Scala Documentation.
- Scala 3 Book.
- Scala 2 Documentation.
- sbt Documentation.
- Scala CLI Documentation.
- Apache Spark Documentation.
- Akka Documentation.
- Play Framework Documentation.
- Cats Documentation.
- Cats Effect Documentation.
- ZIO Documentation.
- ScalaTest Documentation.
- MUnit Documentation.
Висновок
Scala — це статично типізована JVM-мова, яка поєднує функціональне й об’єктно-орієнтоване програмування. Вона особливо корисна для backend-систем, distributed systems, Apache Spark, data engineering, фінансових платформ і складної доменної логіки.
Scala дає сильну типізацію, case classes, pattern matching, immutable collections, функції як значення, Java interoperability і доступ до потужної JVM-екосистеми. Водночас Scala має вищий поріг входу, складнішу type system і потребує узгодженого стилю в команді.
Головна думка: Scala — це потужна мова для типобезпечних JVM-систем, big data й функціонального backend, але її ефективність залежить від зрілої команди, простого стилю й розумного використання абстракцій.
Див. також
- Програмування
- Мова програмування
- 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
- Налагодження коду
- Логування
- Безпека застосунків