Перейти к основному содержимому

Простые приложения на Scala

Разработчику Архитектору

Простые приложения на Scala

Scala на JVM сочетает функциональный стиль (map, Option, for-comprehension) с ООП. Для старта достаточно scala-cli или sbt: примеры ниже — консольные утилиты без Akka/Play.

Как запускать примеры из главы

  1. scala-cli: scala-cli run файл.scala (Scala 3).
  2. sbt: проект с scalaVersionsbt run.
  3. Нужно: 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.


См. также: Java (близкий JVM-стек) · Kotlin

См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).