Scala
Приклад:
! } Потрібно контролювати:
}
Практична роль: 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
Для чого застосовується для 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-систем.
count = count + 1 через Практична роль: functional programming у Scala користувачі можуть писати передбачуваний, тестований і композиційний код.
Приклад: |
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 classresult 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"
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
}
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