Beépített könyvtárak Scalában

Kategória: Scala.

Konzol műveletek

A kírást már láttuk, most ismételjük át egy beolvasással:

println("Hogy hívnak?")
val name = Console.in.readLine()
println("Szia, " + name + "!")

A Console.in.readLine() helyett használhatjuk az újabb scala.io.StdIn.readLine() függvényt is. A scala.io.StdIn osztálynak számos egyéb, típus specifikus része van, pl. a scala.io.StdIn.readInt() számokat olvas be.

Fájlműveletek

A Scala-ban a fájl olvasás viszonylag egyszerű:

val data = scala.io.Source.fromFile("data.txt").mkString
data

A fájlba íráshoz viszont furcsamód nincs standard Scala megoldás, ahhoz a Java osztályokat kell használnunk, pl.

import java.io._

val writer = new PrintWriter(new File("write.txt"))
writer.write("Writing test messages to file.\n")
writer.write("Second line.\n")
writer.close()

A rendszer elérése

A System osztályon keresztül érjük el az operációs rendszert. Például a rendszeridő lekérdezése a következőképpen történhet:

System.currentTimeMillis()

Webes letöltés

HTTP GET kérést az alábbi módon tudunk végrehajtani:

scala.io.Source.fromURL("http://faragocsaba.hu").mkString

Bonyolultabb HTTP kérésekhez külső könyvtárakat érdemes használni.

Többszálúság

A többszálúság a Scala-ban hasonló a Java-hoz: itt is vagy a Thread osztályból származtatunk, vagy megvalósítjuk a Runnable interfészt, majd megfelelő példányosítás után meghívjuk a start() metódust. A második lehetőségre lássunk gey példát:

class MyRunnable extends Runnable {
  override def run(): Unit = {
    println(Thread.currentThread().getName() + " is running.")
    Thread.sleep(1000)
    println(Thread.currentThread().getName() + " stops.")
  }
}

object Multithreading {
  def main(args: Array[String]): Unit = {
    for (x <- 1 to 5) (new Thread(new MyRunnable)).start()
  }
}

Azzal, hogy nincs a Scala-ban ellenőrzött kivétel, a Thread.sleep nem piszkítja össze a kódot a kivételkezeléssel.

Future

A többszálúsághoz szorosan kapcsolódik a Future mechanizmus: a meghívott függvényt külön szálon indítja a program aszinkron módon, így az eredeti szál tovább fut, az erdmény pedig egy Future osztályba kerül, ahol le lehet kérdezni, hogy benne van-e már, és ha igen, akkor mi lett az eredmény. Lássunk erre is egy példát:

import scala.util._
import scala.concurrent._
import scala.concurrent.ExecutionContext.Implicits.global

object FutureExample {
  def longRunningAdd(a: Int, b: Int): Int = {
    Thread.sleep(1000)
    a + b
  }

  def main(args: Array[String]): Unit = {
    val future: Future[Int] = Future {
      longRunningAdd(2, 3)
    }
    while (!future.isCompleted) {
      println("Waiting for the result...")
      Thread.sleep(100)
    }
    future.onComplete {
      case Success(value) => println(value)
      case Failure(e) => e.printStackTrace
    }
  }
}

Grafikus programok

A Scala-ban a grafikus felhasználói felület nem kapott jelentős hangsúlyt. A Java Swingre épül. Van egy köztes réteg a scala.swing csomagban, de az a 2.11-es verziótól kezdve már nem része a standard könyvtáraknak, azt külön hozzá kell adni függőségként. Másik lehetőség a Java osztályok közvetlen használata, pl.

import javax.swing._

val frame = new JFrame("Swing from Scala")
val textArea = new JTextArea
textArea.setText("Ez egy teszt szöveg.")
frame.getContentPane.add(textArea)
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setSize(500, 300)
frame.setVisible(true)

A Swingről ennél egy nem sokkal részletesebb leírást találunk a Java standard könyvtárak oldalon. Az ott megadott külső oldalon (vagy rákeresve a neten) találunk további leírásokat erről a technológiáról.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License