Простые приложения на Scala
Простые приложения на Scala
Scala на JVM сочетает функциональный стиль (map, Option, for-comprehension) с ООП. Для старта достаточно scala-cli или sbt: примеры ниже — консольные утилиты без Akka/Play.
Как запускать примеры из главы
- scala-cli:
scala-cli run файл.scala(Scala 3). - sbt: проект с
scalaVersion→sbt run. - Нужно: JDK 17+.
Генератор паролей
Как запустить
- Файл:
password.scala - Команда:
scala-cli run password.scala - Результат: пароль в stdout.
import scala.util.Random
def generatePassword(length: Int = 16): String = {
val chars = ('a' to 'z') ++ ('A' to 'Z') ++ ('0' to '9') ++ "!@#$%^&*"
Random.shuffle(chars).take(length).mkString
}
@main def run(): Unit = println(generatePassword())
Сортировщик файла
Как запустить
- Файл:
sort.scala,input.txtрядом - Команда:
scala-cli run sort.scala
import scala.io.Source
import java.nio.file.{Files, Paths}
import scala.jdk.CollectionConverters.*
def sortFile(in: String, out: String): Unit = {
val lines = Source.fromFile(in, "UTF-8").getLines().map(_.trim).filter(_.nonEmpty).toSeq.sorted
Files.write(Paths.get(out), lines.asJava)
}
Калькулятор с Option
Как запустить
- Команда:
scala-cli run— вызовитеcalcизmainв том же файле.
def calc(a: Double, b: Double, op: Char): Option[Double] = op match {
case '+' => Some(a + b)
case '-' => Some(a - b)
case '*' => Some(a * b)
case '/' if b != 0 => Some(a / b)
case _ => None
}
JSON-трекер (circe / uPickle — или java.nio + ручной JSON)
На JVM для учёба часто используют uPickle:
// build.sbt: libraryDependencies += "com.lihaoyi" %% "upickle" % "4.0.2"
import upickle.default.*
case class Task(id: Long, title: String, done: Boolean = false)
def load(path: os.Path): Seq[Task] =
if (!os.exists(path)) Nil else read[Seq[Task]](os.read(path))
def save(path: os.Path, tasks: Seq[Task]): Unit =
os.write(path, write(tasks, indent = 2))
Минимальный HTTP (com.sun.net.httpserver)
import com.sun.net.httpserver.{HttpServer, HttpHandler, HttpExchange}
import java.net.InetSocketAddress
val server = HttpServer.create(new InetSocketAddress(8080), 0)
server.createContext("/", (ex: HttpExchange) => {
val body = """{"ok":true}"""
ex.getResponseHeaders.add("Content-Type", "application/json")
ex.sendResponseHeaders(200, body.length)
ex.getResponseBody.write(body.getBytes("UTF-8"))
ex.close()
})
server.start()
Характерный пример — for-comprehension
def safeDivide(a: Double, b: Double): Option[Double] =
for {
_ <- Option.when(b != 0)(())
r <- Some(a / b)
} yield r
println(safeDivide(10, 2))
println(safeDivide(10, 0))
Цепочка Option читается как последовательность шагов без вложенных if.
См. также
Другие статьи этого же раздела в боковом меню (как на странице «О разделе»). История Scala - развитие языка, роль сообщества Typelevel и эволюция функционального направления на JVM. Основы Scala - синтаксис, выражения, типы и базовые принципы программирования на JVM-платформе. Архитектура JVM-приложений на Scala - акторная модель, параллелизм и построение отказоустойчивых сервисов. Типизация, набор правил определения типа данных значений языка. Управляющие конструкции и операторы Scala - выражения вместо инструкций и функциональный стиль управления логикой. Функции и функциональные конструкции в Scala - выражения высшего порядка, композиция и лаконичный стиль. Гайд по установке и настройке с написанием первой программы и её запуском.История языка Scala
Основы языка Scala
Архитектура JVM-приложений на Scala
Типы данных и паттерн-матчинг
Управляющие конструкции и операторы Scala
Функции и функциональные конструкции
Первая программа на Scala