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

Scala

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

Приклад:

Higher-order functions

Практична роль: MUnit часто обирають для простого, швидкого й сучасного тестування Scala-коду.; def describe(value: Any): String = ThisBuild / scalaVersion := "3.3.1"

val active = true println(MathUtils.add(2, 3)) scala-cli run Hello.scala Scala часто використовують як практичну FP-мову на JVM, а Haskell — як чистішу функціональну мову.; class User(val name: String) val active: Boolean = true

<syntaxhighlight lang="bash">

</div>

* персональні інформаційні дані;
* logs;
* event streams;
* Spark datasets;
* data lakes;
* API payloads;
* tokens;
* credentials;
* customer data;
* encryption;
* access control;
* retention policies.; Її сила  у поєднанні обох підходів, але це додатково має змогу ускладнювати стиль коду в команді.; '''Scala'''  це сучасна статично типізована мова програмування, яка функціонує на JVM і поєднує обєктно-орієнтоване та функціональне програмування.; count = count + 1
  • batch processing;
  • distributed data processing;
  • ETL;
  • data pipelines;
  • streaming;
  • machine learning pipelines;
  • big data transformations;
  • typed Dataset API.; * ZIO Documentation.;</syntaxhighlight>
Перевага: Scala дає доступ до зрілої JVM-екосистеми, але надає можливість писати коротший, виразніший і часто більш типобезпечний код, ніж класична Java.; Практична роль: Scala поєднує типобезпеку з type inference, з цієї причини код має змогу бути коротким без втрати перевірок компілятора.;== Enums у Scala 3 ==

Cats Effect

Scala CLI

  • опису effects як значень;
  • async programming;
  • resource safety;
  • concurrency;
  • cancellation;
  • functional services;
  • pure FP architecture.; println(user.name)

val age = 25

  • Apache Spark;
  • ETL;
  • streaming;
  • distributed processing;
  • typed transformations;
  • data validation;
  • big data pipelines;
  • data lake processing;
  • batch jobs.;</syntaxhighlight>

Можливі стеки: object Main {

Scala добре підходить для:

Either

println(multiply(2, 3))

println("Hello, world!")

Scala 3 принесла:

println(s"[LOG] $message")
a + b

Scala застосовується для backend-розробки.; .count() істотно: Scala не змушує обирати лише ООП або FP.; Простий приклад: Практична роль: Play був одним із важливих web frameworks у Scala-екосистемі для backend і API.; * Akka Documentation.; * `Int`;

  • `Long`;
  • `Double`;
  • `Float`;
  • `Boolean`;
  • `Char`;
  • `String`;
  • `Unit`;
  • `Option`;
  • `List`;
  • `Vector`;
  • `Map`;
  • `Set`.;

class HomeController @Inject()(cc: ControllerComponents)

result match {

  • об’єктно-орієнтованому;
  • функціональному;
  • імперативному;
  • declarative;
  • reactive;
  • actor-based;
  • data processing;
  • type-driven design.; given defaultName: String = "Alice"

val data = spark.read.json("data.json")

s"Hello, $name"
  • type classes;
  • functional abstractions;
  • data types;
  • syntax extensions;
  • Either helpers;
  • Validated;
  • Semigroup;
  • Monoid;
  • Functor;
  • Applicative;
  • Monad.; * Scala 2 Documentation.; Python
  • async operations;
  • network calls;
  • parallel computation;
  • non-blocking APIs;
  • backend services.;== Змінні: val і var ==
name <- userName
age <- userAge
yield s"$name is $age"

println(description) </syntaxhighlight>

object MathUtils {

істотно: Future запускається eager-стилем, з цієї причини для складніших functional effect systems часто використовують Cats Effect або ZIO.; sbt застосовується для:

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

ZIO — функціональна Scala-екосистема для asynchronous, concurrent і resilient applications.;== Apache Spark ==

застосовується для: Правило: data pipeline на Scala має захищати інформаційні дані так само уважно, як production backend або аналітична платформа.; Case class — одна з найпопулярніших конструкцій Scala.; * використовувати `val` замість `var`;

  • моделювати домен через case classes;
  • використовувати Option замість null;
  • не зловживати implicits;
  • у Scala 3 використовувати given/using обережно;
  • писати маленькі функції;
  • уникати over-engineering;
  • обирати один стиль у команді;
  • покривати код тестами;
  • використовувати formatter;
  • контролювати dependencies;
  • писати зрозумілі типи для public API;
  • не приховувати бізнес-логіку в складних абстракціях;
  • документувати non-obvious FP code.; Водночас Scala має вищий поріг входу, складнішу type system і потребує узгодженого стилю в команді.;
println(describe(UserCreated("Alice")))

println(sum)

<syntaxhighlight lang="scala">

</div>

<syntaxhighlight lang="scala">
</div>

Приклад:
</div>
 .groupBy("country")
case class User(id: Long, name: String, active: Boolean)

завдяки наявності JVM Scala отримує:
== Scala і Python ==

 extends AbstractController(cc) {

* factory methods;
* apply methods;
* validation;
* serializers;
* implicits або givens;
* допоміжної логіки типу.;<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">

Scala додатково є собою обєктно-орієнтованою мовою.;</div>
import scala.concurrent.Future

</div>

divide(10, 2) match {

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

* classes;
* objects;
* traits;
* inheritance;
* composition;
* encapsulation;
* polymorphism;
* abstract classes.; def findUser(id: Int): Option [String] =

<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">
println(greet)
Рекомендовано:

Pattern matching добре функціонує з case classes:

println(result)

val result = numbers

* 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.; }
<div style="background:#ecfdf5; border-left:6px solid #10b981; padding:12px; margin:12px 0;">

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

!;=== Обробка списку ===

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

мова, яка має змогу масштабуватися від коротких скриптів до великих enterprise-систем виступає ключовою рисою Назва '''Scala''' походить від '''scalable language'''.; case UserCreated(name) => s"Created: $name"
 .in(file("."))

!; .map(name => s"Found: $name")

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

lazy val root = project </syntaxhighlight> For-comprehension — зручний синтаксис для роботи з колекціями, Option, Either, Future та іншими типами.; val price = 19.99 Перевага collections: Scala надає можливість обробляти колекції декларативно через `map`, `filter`, `fold`, `flatMap` та інші функції.;
== Класи ==

== Приклади задач на Scala ==

!; * Scala 3 Book.;== Функції ==
== Див.; додатково ==
'''Option''' застосовують, коли потрібно для значень, які можуть бути відсутні.; '''MUnit'''  легкий testing framework, популярний у сучасній Scala-екосистемі.;
def index = Action {
Суть trait: trait має змогу бути і контрактом, і частковою реалізацією поведінки.;
def run(): Unit =

}

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

</syntaxhighlight>

</syntaxhighlight>

case Card(number: String)

println(message)

if b == 0 then Left("Division by zero")

val user = User("Alice", 25)

@main def hello(): Unit =

} Або коротше:

Поширені помилки:

} Scala надає можливість писати код у різних стилях:

}

Scala і Kotlin обидві працюють на JVM, але мають різний фокус.; * sbt Documentation.; println(updatedUsers) </syntaxhighlight> val numbers = List(1, 2, 3, 4, 5)

.settings(

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

Приклад:

  • високий поріг входу;
  • складна type system;
  • різні стилі коду в екосистемі;
  • складність implicits у Scala 2;
  • час компіляції;
  • складність build tools;
  • менша кількість розробників, ніж у Java або Python;
  • складність onboarding;
  • ризик over-engineering;
  • складність деяких FP-абстракцій;
  • різниця між Scala 2 і Scala 3 в existing projects.;== For-comprehension ==

println(parseAge("25"))

  • офіційно затверджений сайт Scala.;
    == Загальний характеристика ==
    
    Зазвичай:
    
    * `val`  незмінне значення;
    * `var`  змінна, яку можна змінювати.; else Right(a / b)
    

У Scala 3 створення об’єкта класу часто має змогу не вимагати `new`.; * utility methods;

  • entry points;
  • companion objects;
  • factories;
  • configuration;
  • singleton services.; a + b

println(doubled)

}

Приклад із List: </syntaxhighlight> У Scala зазвичай рекомендується використовувати `val`, якщо змінність не потрібна.; ScalaTest — популярний testing framework для Scala.; val doubled = numbers.map(_ * 2)

Практична роль: Scala є собою однією з ключових мов для Apache Spark і big data workflows.;

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

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

test("addition") {

Практична роль: enums у Scala 3 зручні для моделювання станів, подій, типів повідомлень і доменних варіантів.; Функції в Scala є собою first-class values.; * Scala Documentation.; }

  • 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.; * MUnit Documentation.; println(today)

Akka — toolkit для concurrent, distributed і actor-based systems у Scala та Java.; assert(2 + 3 == 5) Spark написаний на Scala й має природну підтримку Scala API.; val user = User(1, "Alice", active = true)

Тематичні мітки

Companion object — це object із такою самою назвою, як клас, у з цієї причини самому файлі.; Приклад:

case UserBlocked(name) => s"Blocked: $name"
Суть прикладу: Scala має змогу виглядати коротко й сучасно, але паралельно з цим компілюється для JVM.;

Суть функцій у Scala: функції можна передавати, повертати, зберігати й комбінувати як звичайні значення.;== Data engineering == Companion object часто застосовується для:

object у Scala — це singleton object.; Haskell

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

println(users) Scala має змогу бути не найкращим вибором для: Приклад:

Given і using у Scala 3

Платформа JVM JVM
Стиль ООП + FP Переважно ООП, із сучасними FP-елементами
Синтаксис Виразніший, компактніший Більш традиційний і явний
Type system Потужніший і складніший Простішій для більшості команд
програмний пакет Scala + Java libraries Дуже велика Java-екосистема
Поріг входу Вищий Нижчий для enterprise-команд

Висновок

}

User(name)

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

Приватність даних

def findUser(id: Long): Option [String] = Практична роль: ScalaTest є собою одним із найпоширеніших інструментів тестування в Scala-проєктах.; Scala має обмеження.; Kotlin

Увага: Akka дає потужну модель actor-based systems, але потребує розуміння concurrency, message passing і failure handling.; println("Hello".exclaim) val userName: Option [String] = Some("Alice") Приклад:

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

істотно: Option робить відсутність значення явною частиною типу, з цієї причини код менше покладається на небезпечний `null`.;

val sum = numbers.sum

Object-oriented programming

Play Framework — web framework для Scala і Java.;
def greet(implicit name: String): String =

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

== Перша програма на Scala ==
Scala має сильну екосистему collections.; Критерій
Приклад:

'''Висновок:''' sbt є собою класичним вибором, Scala CLI зручний для старту, а Mill часто обирають як легшу альтернативу для build automation.;<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
val result =
== Objects ==

Приклад:

'''Scala'''  це статично типізована JVM-мова, яка поєднує функціональне й обєктно-орієнтоване програмування.; case class User(name: String, age: Int)
val message = findUser(1)

<syntaxhighlight lang="scala">

 event match {

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

* `Some(value)`;
* `None`.; Потрібно контролювати:

var count = 0

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

Scala 3 має зручні enums.;
}

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

 )

'''Практична роль:''' Either надає можливість обробляти помилки як значення, а не лише через exceptions.; def create(name: String): User =
'''Cats Effect'''  бібліотека для functional effect systems у Scala.; Extension methods дозволяють додавати методи до існуючих типів без зміни їхнього коду.; Scala має статичну типізацію, але часто має змогу виводити типи автономно.; '''Практична роль:''' extension methods роблять API зручнішим і типобезпечнішим, особливо в бібліотеках.; * Scala CLI Documentation.; }

</div>

class MathSuite extends munit.FunSuite {

</syntaxhighlight> }

Extension methods

Хороші практики Scala

extension (text: String)

Scala має дві важливі гілки: Небезпека: Scala надає можливість писати дуже абстрактний код, але якщо команда його не розуміє, супровід системи стає дорожчою.; !;</syntaxhighlight>

<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">
'''Cats'''  бібліотека для функціонального програмування в Scala.; val numbers = List(1, 2, 3, 4, 5)
 if id == 1 then Some("Alice") else None
trait Logger {

=== Pattern matching із case class ===
class User(val name: String, val age: Int) {

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

Приклад:
'''Порада:''' Try корисний на межах із Java API або кодом, який використовує exceptions.; Вона застосовується для:

</div>

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

Scala часто застосовується в data engineering і backend, з цієї причини приватність важлива.; `Try` має змогу бути:
== ZIO ==
Приклад:

val price: Double = 19.99
'''Практична роль:''' Scala не ізольована від Java-світу  вона має змогу використовувати Java-бібліотеки, JVM tooling і enterprise-інфраструктуру.; * ScalaTest Documentation.; val updatedUsers = users :+ "Carol"
 }
</div>

</div>

* навчання;
* швидких скриптів;
* невеликих проєктів;
* запуску single-file programs;
* experiments;
* простішого старту зі Scala.;== Типи даних ==
 case 0 => "zero"
 println("Hello, world!")

<syntaxhighlight lang="scala">

 value match {

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

== Scala і Kotlin ==
 .filter($"age" > 18)
'''Головне правило:''' хороший Scala-код має бути типобезпечним, композиційним і зрозумілим для команди, а не без ускладнень максимально розумним.; case class User(name: String, age: Int)
'''Висновок:''' Scala часто обирають як практичний баланс між FP-ідеями й JVM-production, а Haskell  для чистішого функціонального підходу.;<syntaxhighlight lang="scala">
 .filter(_ % 2 == 0)
 .map(_ * 10)

println(result)

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

}

case class UserBlocked(name: String) extends Event

Головна думка: Scala — це потужна мова для типобезпечних JVM-систем, big data й функціонального backend, але її ефективність залежить від зрілої команди, простого стилю й розумного використання абстракцій.;== Companion object == Scala 3 підтримує роботу extension methods.;</syntaxhighlight>

Scala і Python часто зустрічаються в data engineering, особливо зі Spark.; Критерій

</div>
Можливі складнощі:

Оригінальний список не змінюється, а створюється новий.; println(user.copy(age = 26))

 case Some(age) => Right(age)

}
'''Pattern matching'''  одна з ключових можливостей Scala.; * Cats Documentation.; val name: String = "Alice"

* implicit parameters;
* implicit conversions;
* extension-like methods;
* type classes;
* context passing.; '''Критично:''' типобезпека Scala не замінює security review.;<syntaxhighlight lang="scala">

!; Scala
|-
| Платформа
| JVM
| GHC runtime
|-
| Стиль
| ООП + FP
| Pure functional programming
|-
| Практичність enterprise
| Вища через JVM
| Менша в масовому enterprise
|-
| Чистота FP
| Компромісна
| Дуже сильна
|-
| програмний пакет
| JVM + Scala
| Haskell ecosystem
|}

Scala 3 замінює частину implicit-механізмів більш явними `given` і `using`.;=== Безпечний пошук через Option ===
<syntaxhighlight lang="scala">

import java.time.LocalDate
def log(message: String): Unit =
== sbt ==
future.foreach(result => println(result))

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

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

sbt — традиційний build tool для Scala.;
case Right(value) => println(value)

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

Головна перевага: Scala надає можливість будувати складні типізовані системи на JVM із виразним функціональним і об’єктним кодом.; Критерій

Futures

Scala заохочує immutable data.; name := "my-scala-app",

class Service extends Logger {

Приклад:

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

  • effect management;
  • typed errors;
  • concurrency;
  • resource safety;
  • dependency injection;
  • streams;
  • testing;
  • backend services.; val result = add(2, 3)

implicit val defaultName: String = "Alice" println(user.greet())

Практична порада: нові проєкти варто розглядати на Scala 3, але в existing systems часто ще зустрічається Scala 2 через велику legacy-екосистему.;== Pattern matching ==

}

Суть Cats Effect: side effects не виконуються хаотично, а описуються як контрольовані значення, які можна комбінувати й запускати.; Scala def applyTwice(x: Int, f: Int => Int): Int =

case User(name, age) if age >= 18 => s"Hello, adult $name"

val result = applyTwice(3, _ + 1)

def greet(): String =

</syntaxhighlight> </syntaxhighlight>

}

case New, Active, Blocked

Поширені колекції:

JVM

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

Підказка: типова сила Scala проявляється в комбінації case classes, pattern matching, immutable collections і типобезпечної обробки помилок.; Приклад: Scala підтримує роботу класи й об’єктно-орієнтоване програмування.; class MathTest extends AnyFunSuite { Приклад:

</syntaxhighlight>

  • 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.; * actor systems;
  • distributed systems;
  • event-driven services;
  • streaming;
  • resilience;
  • message-driven architecture;
  • supervision;
  • concurrency.; Приклад:

Akka

Приклад:

Cats

Scala і Java

.getOrElse("User not found")

val description =

def greet(user: User): String =
Приклад:
Enum із даними:

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

'''Увага:''' implicits дуже потужні, але надмірне або неочевидне використання має змогу ускладнювати читання й debugging.;{{SEO
|title=Scala  мова програмування для JVM, функціонального програмування, Akka, Spark і масштабованих систем
|description=Scala  Wiki-стаття про сучасну мову програмування для JVM, яка поєднує обєктно-орієнтований і функціональний підходи. Розглянуто Scala 2, Scala 3, JVM, sbt, Scala CLI, traits, case classes, pattern matching, collections, immutability, Futures, Akka, Apache Spark, Play Framework, Cats, ZIO, переваги, обмеження і хороші практики.
|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, програмування
|alternativeTo=Java для частини JVM-проєктів; verbose enterprise-код; ручне написання boilerplate; окремі мови для функціонального й обєктного стилю; складні data pipelines без виразного типізованого коду; менш типобезпечні backend-рішення; скриптові рішення там, де потрібна JVM-екосистема й сильна типізація
}}
val name = "Alice"
</div>

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

Try

import scala.concurrent.ExecutionContext.Implicits.global

val future = Future {

  • збірки проєктів;
  • керування залежностями;
  • запуску тестів;
  • multi-module projects;
  • publishing;
  • інтеграції з JVM;
  • запуску Scala applications.; }

Mill часто цінують за: println(user.copy(active = false))

;</syntaxhighlight>

Play Framework

Functional programming

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

</syntaxhighlight>

</div>

</div>

'''істотно:''' Scala дає велику силу, але потребує зрілої інженерної культури й узгодженого стилю в команді.;== Immutability ==

{| class="wikitable"

* дуже простих CRUD-застосунків;
* команд без JVM-досвіду;
* команд без часу на навчання FP;
* швидких прототипів;
* mobile development;
* embedded;
* сценаріїв, де Python або Java достатні й простіші;
* проєктів із високою плинністю junior-розробників;
* систем, де складна type system буде більше заважати, ніж допомагати.;</div>

Приклад:
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">

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

def describe(event: Event): String =
'''Суть Scala 3 підходу:''' `given` і `using` роблять контекстні параметри більш явними й структурованими.; Основні ідеї:
 f(f(x))
Akka застосовується для:

Приклад:

У Scala є собою два основні способи оголошення змінних:

</syntaxhighlight>

val user = User("Alice", 25)

  • `Success(value)`;
  • `Failure(exception)`.; println(result)

Приклад взаємодії з Java:

завдяки наявності Практична роль: functional programming у Scala користувачі можуть писати передбачуваний, тестований і композиційний код.;

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

version := "0.1.0"

val today = LocalDate.now()

Scala і Haskell

def exclaim: String = text + "!"

Scala компілюється в bytecode для JVM, з цієї причини має змогу взаємодіяти з Java-кодом і використовувати велику кількість Java-бібліотек.;</syntaxhighlight> Try застосовується для обгортання коду, який має змогу кинути exception.; def greet(using name: String): String =

  • unit tests;
  • integration tests;
  • behavior-style tests;
  • testing JVM applications;
  • Spark testing;
  • backend testing.;== Traits ==

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

Приклад:

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

Trait — це спосіб описати спільну поведінку або контракт.; Висновок: Python зручніший для data science і прототипів, а Scala сильніша для типізованих JVM/Spark production pipelines.; Приклад напряму: Практична порада: Scala варто обирати, коли команда цінує типобезпеку, функціональний стиль і JVM-інфраструктуру.; Вона особливо корисна для backend-систем, distributed systems, Apache Spark, data engineering, фінансових платформ і складної доменної логіки.; s"Hello, $name" result.show() println(result)

Mill — альтернативний build tool для Scala.; import org.scalatest.funsuite.AnyFunSuite import scala.util.Try

s"Hello, $name"
case None => Left("Invalid age")
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">

object User {

 case _ => "unknown"

* '''Scala 2'''  довго була основною версією мови, на ній побудовано багато production-проєктів;
* '''Scala 3'''  новіша реліз мови, додатково відома як Dotty під час розробки, із покращеннями синтаксису, типів і metaprogramming.;<syntaxhighlight lang="scala">
<syntaxhighlight lang="scala">
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">

val userAge: Option [Int] = Some(25)

</syntaxhighlight>

println(parseAge("abc"))

println(greet)
<syntaxhighlight lang="scala">

Типові задачі:
enum Status:
== переважні аспекти Scala ==
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
!; if id == 1 then Some("Alice") else None
val user = User.create("Alice")
== Типові помилки початківців ==
case Left(error) => println(error)

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

Коли Scala має змогу бути невдалим вибором

Основні типи: </syntaxhighlight> def divide(a: Int, b: Int): Either [String, Int] =

Практична роль: класи використовуються для опису доменних сутностей, сервісів, конфігурацій і бізнес-об’єктів.;

== Джерела ==

* interfaces;
* shared behavior;
* mixins;
* dependency abstraction;
* type classes;
* composition.; for
 Ok("Hello from Play")

== Collections ==

val age: Int = 25
'''Основна ідея:''' Scala поєднує виразність функціонального програмування з JVM-екосистемою, типобезпекою й можливістю використовувати Java-бібліотеки.;

Практична роль: ZIO пропонує цілісний підхід до побудови функціональних Scala-застосунків із strongly typed effects.;

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

 log("Service started")

* constructor;
* `toString`;
* `equals`;
* `hashCode`;
* `copy`;
* pattern matching support;
* зручну роботу з immutable data.;<syntaxhighlight lang="scala">

!;</div>

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

</div>

* переносимість між платформами;
* доступ до Java-бібліотек;
* зрілу runtime-екосистему;
* garbage collection;
* tooling;
* monitoring;
* профілювання;
* інтеграцію з enterprise-середовищем;
* production-ready infrastructure.;</div>

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

<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
 text.toIntOption match {
<syntaxhighlight lang="scala">
</div>
'''Головна перевага case class:''' вона ідеально підходить для опису даних, DTO, доменних моделей і immutable structures.; * Cats Effect Documentation.;<syntaxhighlight lang="scala">

* новий синтаксис із optional braces;
* `given` і `using` замість частини implicit-механізмів;
* enums;
* extension methods;
* opaque types;
* покращення type system;
* нові функціональні можливості metaprogramming.; Приклад:
У Scala 2 механізм `implicit` використовувався для:
'''Практична роль:''' companion object надає можливість зберігати логіку, повязану з типом, але не привязану до конкретного екземпляра.; '''Суть higher-order functions:''' поведінку можна передавати як аргумент, що робить код гнучким і композиційним.;== Обмеження Scala ==
<syntaxhighlight lang="scala">
<syntaxhighlight lang="scala">

<syntaxhighlight lang="scala">
</div>

Scala дає сильну типізацію, case classes, pattern matching, immutable collections, функції як значення, Java interoperability і доступ до потужної JVM-екосистеми.; assertEquals(2 + 3, 5)
== Backend development ==

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

case class UserCreated(name: String) extends Event

<syntaxhighlight lang="scala">

Scala застосовується у різних типах проєктів.;<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">

val users = List("Alice", "Bob")
'''Практична роль:''' Cats сприяє будувати функціональний Scala-код на основі формальних абстракцій і композиції.; Java

Приклад:
</div>
val result = data

</div>
 }
val name = "Alice"

== Option ==
Scala-застосунки мають звичайні security-ризики JVM і backend-систем.; val result = findUser(1)

<syntaxhighlight lang="scala">
</div>

</div>
== Implicits у Scala 2 ==

Either застосовується для результату, який має змогу бути успішним або помилковим.; Приклад:

  • REST API;
  • microservices;
  • event-driven systems;
  • streaming services;
  • financial backends;
  • integration services;
  • high-load systems;
  • data APIs.; Objects використовуються для:
  • 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.; Вона сприяє з частиною помилок, але не захищає автономно від поганої авторизації, витоків даних або небезпечних залежностей.; for n <- numbers
yield n * 2

println(result) </syntaxhighlight>

}

Приклад:

case n: Int => s"number: $n"

!; Висновок: Kotlin часто є собою практичнішою заміною Java, а Scala — мовою для глибшого FP, типобезпеки й data engineering.; Case classes автономно дають:

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

Приклад із Option: !; Надмірна абстракція має змогу зробити код важким для команди.; Головне правило: у Scala краще починати з `val`, а `var` використовувати лише там, де змінність справді потрібна.; val numbers = List(1, 2, 3)

<syntaxhighlight lang="scala">

Scala є собою важливою мовою для data engineering.; !; * Play Framework Documentation.;<div style="background:#eef2ff; border-left:6px solid #4f46e5; padding:12px; margin:12px 0;">

</div>

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

* швидкість;
* зрозуміліший build definition;
* підтримку multi-module projects;
* простішу модель задач;
* інтеграцію з Scala і Java.;<syntaxhighlight lang="scala">

Scala часто порівнюють із Java.; '''Практична роль:''' pattern matching надає можливість явно й безпечно обробляти різні форми даних.; {| class="wikitable"

 test("addition works") {

</div>

'''JVM''' або '''Java Virtual Machine'''  це середовище виконання, на якому функціонує Scala.; def add(a: Int, b: Int): Int =
Замість `null` у Scala часто використовують:
<syntaxhighlight lang="scala">

 40 + 2

Play застосовується для:
  • `List`;
  • `Vector`;
  • `Array`;
  • `Map`;
  • `Set`;
  • `Seq`;
  • `LazyList`.; Головна перевага в data engineering: Scala природно поєднується з Apache Spark і JVM-based data platforms.; def add(a: Int, b: Int): Int =

val even = numbers.filter(_ % 2 == 0) |- | Типізація | Статична | Динамічна |- | Spark | Нативна мова Spark | Дуже популярна через PySpark |- | Швидкість розробки | Вища дисципліна, більше типів | Швидке прототипування |- | Production data pipelines | Сильна типобезпека | Простота й широка data science програмний пакет |- | AI / ML | Менша програмний пакет | Дуже сильна програмний пакет |}

Приклад:

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

sealed trait Event

</syntaxhighlight> !;== Case classes ==

Класичний стиль:

Scala 2 і Scala 3

  • web applications;
  • REST API;
  • reactive services;
  • backend systems;
  • MVC applications;
  • asynchronous web apps.; * Apache Spark Documentation.; Cats надає:
  • Akka HTTP;
  • Play Framework;
  • http4s;
  • ZIO HTTP;
  • Tapir;
  • Finagle;
  • Cats Effect;
  • ZIO;
  • Doobie;
  • Slick;
  • Quill.; Scala
  • `Right` — успіх;
  • `Left` — помилка.; Типові сценарії:
user match {

Висновок: Scala дає більше виразності й FP-можливостей, а Java часто простіша для масових enterprise-команд і має ширшу кадрову базу.; Суть object: Scala має вбудований спосіб створювати singleton без статичних методів у стилі Java.; * immutability;

  • pure functions;
  • referential transparency;
  • higher-order functions;
  • algebraic data types;
  • pattern matching;
  • type classes;
  • error handling through types;
  • composition;
  • effects.; істотно: Scala найкраще розкривається в командах, які готові інвестувати в типобезпеку, функціональний стиль, якісну архітектуру й дисципліну коду.; println(even)

Вона підтримує роботу:

val result = Try("123".toInt)

Практична роль: for-comprehension робить послідовність операцій читабельнішою, особливо коли кожен крок повертає wrapper type.; Критерій

case None => println("Not found")
Scala застосовується для backend-розробки, distributed systems, data engineering, big data, Apache Spark, stream processing, фінансових систем, високонавантажених сервісів, typed functional programming і складної бізнес-логіки.; Future у Scala представляє асинхронне обчислення.;