Scala for Backend Engineering & Functional Programming · Pelajaran

Source, Flow, dan Sink

Blok penyusun aliran data.

Pelajaran 1 dari 413 langkah

Source, Flow, dan Sink adalah pelajaran Scala for Backend Engineering & Functional Programming gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Scala for Backend Engineering & Functional Programming, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Scala for Backend Engineering & Functional Programming mencakup 4 pelajaran total.

Tiga Blok Pembangun

Akka Streams memodelkan alur data sebagai graf tahapan pemrosesan. Tiga tahapan linear utamanya adalah Source (menghasilkan elemen), Flow (mengubahnya), dan Sink (menggunakannya).

Sebuah Source memiliki satu keluaran, Sink memiliki satu masukan, dan Flow memiliki tepat satu masukan serta satu keluaran. Menghubungkan semuanya menjelaskan apa yang harus terjadi, bukan kapan terjadinya.

Mendefinisikan Source

Sebuah Source[Out, Mat] memancarkan elemen bertipe Out dan menyediakan nilai materialisasi bertipe Mat. Source paling sederhana berasal dari koleksi atau rentang dalam memori.

Sebelum aliran dijalankan, Source hanyalah cetak biru tak berubah yang dapat digunakan kembali dengan bebas.

import akka.stream.scaladsl.Source

val numbers: Source[Int, akka.NotUsed] =
  Source(1 to 100)

val single: Source[String, akka.NotUsed] =
  Source.single("hello")

Mendefinisikan Sink

Sebuah Sink[In, Mat] menggunakan elemen bertipe In. Nilai materialisasi sering menyimpan hasil penggunaan, seperti Future yang selesai saat aliran berakhir.

Sink.foreach menjalankan efek samping untuk setiap elemen; Sink.fold mengakumulasikan satu hasil.

import akka.stream.scaladsl.Sink
import scala.concurrent.Future

val printSink: Sink[Int, Future[akka.Done]] =
  Sink.foreach(println)

val sumSink: Sink[Int, Future[Int]] =
  Sink.fold(0)(_ + _)

Mendefinisikan Flow

Sebuah Flow[In, Out, Mat] berada di antara Source dan Sink serta mengubah setiap elemen. Flow dapat digunakan kembali secara mandiri dan dikomposisikan sebelum dilampirkan ke titik akhir mana pun.

Di sini, sebuah Flow menggandakan bilangan bulat dan mengubahnya menjadi string.

import akka.stream.scaladsl.Flow

val doubleToString: Flow[Int, String, akka.NotUsed] =
  Flow[Int]
    .map(_ * 2)
    .map(n => s"value=$n")

Menghubungkan Source ke Sink

Operator via melampirkan Flow ke Source, sedangkan to melampirkan Sink. Menghubungkan Source langsung ke Sink dengan to menghasilkan RunnableGraph: cetak biru tertutup yang dapat dijalankan.

Belum ada elemen yang bergerak; ini hanya menjelaskan topologi.

import akka.stream.scaladsl.{Source, Sink, RunnableGraph}

val graph: RunnableGraph[akka.NotUsed] =
  Source(1 to 10).to(Sink.foreach(println))

via: Menyisipkan Flow

Gunakan via untuk menyisipkan Flow ke dalam pipeline. Source.via(flow) menghasilkan Source baru yang tipe outputnya cocok dengan output Flow.

Merangkai pemanggilan via memungkinkan Anda membangun pipeline transformasi yang panjang dari bagian-bagian Flow kecil yang mudah diuji.

val pipeline =
  Source(1 to 10)
    .via(Flow[Int].filter(_ % 2 == 0))
    .via(Flow[Int].map(_ * 10))
    .to(Sink.foreach(println))

Keamanan Tipe di Seluruh Tahap

Kompilator memastikan bahwa tipe output setiap tahap cocok dengan tipe input tahap berikutnya. Source[Int] tidak dapat terhubung ke Sink[String] tanpa Flow perantara yang mengonversi tipenya.

Pemeriksaan statis ini mendeteksi kesalahan penyambungan pipeline sebelum runtime.

// Source[Int] -> Flow[Int, String] -> Sink[String]
val ok =
  Source(1 to 3)
    .via(Flow[Int].map(_.toString))
    .to(Sink.foreach[String](println))

Nilai yang Dimaterialisasi

Setiap cetak biru membawa nilai yang dimaterialisasi: sebuah pegangan yang dihasilkan saat stream dijalankan. Sink.fold mematerialisasi Future berisi hasil. Secara bawaan, penggabungan tahap mempertahankan nilai materialisasi paling kiri (NotUsed untuk sumber biasa).

Gunakan toMat dan Keep untuk memilih nilai dari sisi mana yang Anda inginkan.

import akka.stream.scaladsl.Keep
import scala.concurrent.Future

val g: RunnableGraph[Future[Int]] =
  Source(1 to 100)
    .toMat(Sink.fold(0)(_ + _))(Keep.right)

Komponen yang Dapat Digunakan Kembali

Karena Source, Flow, dan Sink adalah nilai yang tidak dapat diubah, Anda dapat mendefinisikannya sekali lalu menggunakannya kembali di banyak pipeline. Hal ini mendorong terbentuknya pustaka berisi tahap pemrosesan kecil yang memiliki nama.

Flow yang didefinisikan untuk penguraian dapat disisipkan ke pipeline file maupun pipeline HTTP.

val parse: Flow[String, Int, akka.NotUsed] =
  Flow[String].map(_.trim.toInt)

val fromFile  = lines.via(parse)
val fromHttp  = requestBody.via(parse)

Konstruktor Source yang Umum

Akka Streams menyediakan banyak factory Source: Source.single, Source.repeat, Source.tick untuk emisi berbasis waktu, Source.future dari sebuah Future, dan Source.empty.

Memilih konstruktor yang tepat membuat maksud produsen data menjadi jelas.

import scala.concurrent.duration._

val ticks  = Source.tick(0.seconds, 1.second, "tick")
val onceF  = Source.future(scala.concurrent.Future.successful(42))
val forever = Source.repeat("x")

Konstruktor Sink yang Umum

Demikian pula, sink mencakup Sink.head (elemen pertama sebagai Future), Sink.seq (mengumpulkan semuanya ke dalam Seq), Sink.ignore (menguras lalu membuang), dan Sink.last.

Untuk pipeline yang mengembalikan hasil ke kode Anda, Sink.seq dan Sink.fold adalah yang paling umum digunakan.

import scala.concurrent.Future

val collect: Sink[Int, Future[Seq[Int]]] = Sink.seq
val firstOne: Sink[Int, Future[Int]]    = Sink.head
val drain: Sink[Int, Future[akka.Done]] = Sink.ignore

Pemeriksaan Singkat

Uji pemahaman Anda tentang tipe tahap linear.

Ringkasan

Anda telah mempelajari tiga blok penyusun linear: Source menghasilkan, Flow mengubah, dan Sink mengonsumsi. Ketiganya adalah cetak biru yang tidak dapat diubah dan dapat digunakan kembali, lalu dihubungkan dengan via dan to.

Menghubungkan Source ke Sink menghasilkan RunnableGraph yang membawa nilai materialisasi, tetapi belum memindahkan data sampai dijalankan. Selanjutnya, Anda akan mengubah stream dengan operator yang lebih kaya.

Gratis untuk memulai

Belajar Scala dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
39
Pelajaran
143

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Source, Flow, dan Sink” gratis?

Ya — teks lengkap “Source, Flow, dan Sink” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Scala for Backend Engineering & Functional Programming, upgrade ke CoddyKit PRO. Kursus Scala for Backend Engineering & Functional Programming mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Source, Flow, dan Sink”?

Blok penyusun aliran data. Kamu berlatih Scala for Backend Engineering & Functional Programming dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Scala for Backend Engineering & Functional Programming?

Tidak diperlukan pengalaman sebelumnya. Scala for Backend Engineering & Functional Programming di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Source, Flow, dan Sink” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Scala for Backend Engineering & Functional Programming ini?

Ya. Setiap pelajaran Scala for Backend Engineering & Functional Programming menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Source, Flow, dan Sink
  2. Mengubah Aliran
  3. Tekanan Balik
  4. Menjalankan Pipeline
← Kembali ke Scala for Backend Engineering & Functional Programming