0Pricing
Scala for Backend Engineering & Functional Programming · Ders

Akışları Dönüştürme

Akış hâlindeki verileri eşleyip filtreleyin.

Akışları Dönüştürme, CoddyKit'te ücretsiz bir Scala for Backend Engineering & Functional Programming dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Scala for Backend Engineering & Functional Programming öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Scala for Backend Engineering & Functional Programming kursu toplamda 4 dersten oluşur.

Dönüşüm Olarak İşleçler

Akka Streams, Scala'nın koleksiyon API'sini andıran, ancak eşzamansız çalışan ve geri basınca uyan zengin bir Source ve Flow işleçleri kümesi sunar.

Her işleç yeni bir taslak döndürür; böylece dönüşümler, akış çalıştırılmadan önce bildirimsel olarak birleştirilir.

map ve filter

map her öğeye eşzamanlı bir işlev uygular; filter bir koşulu karşılamayan öğeleri atar. Bunlar, öğe bazlı dönüşümün temel araçlarıdır.

Her ikisi de sıralamayı korur ve tamamlanma ile hatayı aşağı akışa iletir.

val flow =
  Flow[Int]
    .filter(_ % 2 == 0)
    .map(n => n * n)

Bire Çok İçin mapConcat

Tek bir girdinin birden çok çıktı üretmesi gerektiğinde mapConcat kullanın. Bu işleç, yinelenebilir bir değer döndüren bir işlev alır ve sonuçları düzleştirerek akışa aktarır.

Boş bir koleksiyon döndürmek, öğeyi etkili bir şekilde atar.

val explode: Flow[String, String, akka.NotUsed] =
  Flow[String].mapConcat(line => line.split(",").toList)

val words = Source(List("a,b", "c,d,e"))
  .via(explode)

grouped ve sliding

grouped(n), art arda gelen öğeleri en fazla n öğe içeren bir Seq içinde toplu hâle getirir; bu, veritabanına toplu yazma işlemleri için kullanışlıdır. sliding(n) ise birbiriyle örtüşen pencereler üretir.

Toplu işleme, G/Ç ağırlıklı işlem hatlarında öğe başına düşen ek yükü azaltır.

val batches: Source[Seq[Int], akka.NotUsed] =
  Source(1 to 1000).grouped(100)

val windows =
  Source(1 to 10).sliding(3, step = 1)

scan ve fold

scan, her öğeden sonra güncel birikim değerini yayımlar ve zaman içinde değişen bir durum akışı sağlar. fold ise yalnızca yukarı akış tamamlandığında birikmiş son değeri yayımlar.

Canlı sayaçlar için scan, terminal toplulaştırmalar için fold kullanın.

val running =
  Source(1 to 5).scan(0)(_ + _) // 0,1,3,6,10,15

val total =
  Source(1 to 5).fold(0)(_ + _) // 15

Eşzamansız İşler İçin mapAsync

mapAsync(parallelism), bir Future döndüren işlevi çağırır ve sonuçları sıralı olarak yayımlar; aynı anda en fazla parallelism sayıda Future çalıştırır.

Sıralamanın önemli olduğu veritabanı aramaları veya HTTP istekleri gibi eşzamansız çağrılar için kullanın.

import scala.concurrent.Future

val enriched =
  Flow[UserId]
    .mapAsync(parallelism = 4)(id => lookup(id))

def lookup(id: UserId): Future[User] = ???

mapAsyncUnordered

mapAsyncUnordered, mapAsync gibi çalışır; ancak her sonucu tamamlanır tamamlanmaz yayımlar ve girdi sırasını dikkate almaz.

Aşağı akış sıralamayla ilgilenmediğinde aktarım hızını artırabilir; çünkü yavaş bir Future artık daha hızlı olanları engellemez.

val fast =
  Flow[UserId]
    .mapAsyncUnordered(parallelism = 8)(id => lookup(id))

statefulMapConcat ile Durum Tutan Dönüşüm

Değiştirilebilir yerel durum gerektiren öğe bazlı dönüşümler için statefulMapConcat, her somutlaştırmada yeni bir durum oluşturur ve çıktıların yinelenebilir bir değerini döndürür.

Akış çalıştırmaları arasında durum paylaşmadan sayaçları veya arabellekleri korumanın güvenli yolu budur.

val withIndex: Flow[String, (Int, String), akka.NotUsed] =
  Flow[String].statefulMapConcat { () =>
    var i = 0
    elem => { i += 1; List((i, elem)) }
  }

Zamana Dayalı İşleçler

Akışlar içeriğin yanı sıra zamana göre de dönüştürülebilir. throttle yayım hızını sınırlar, groupedWithin boyuta veya geçen süreye göre toplu işleme yapar ve takeWithin süreyi sınırlar.

Bunlar, hız sınırına tabi harici API'ler için gereklidir.

import scala.concurrent.duration._

val limited =
  Source(1 to 1000)
    .throttle(10, 1.second)
    .groupedWithin(100, 500.millis)

Dönüşümlerde Hataları Ele Alma

Bir işleç içinde fırlatılan istisna, varsayılan olarak tüm akışın başarısız olmasına neden olur. Bir denetim stratejisi bunun yerine resume ile hatalı öğeyi atabilir veya aşamayı restart ile yeniden başlatabilir.

Stratejiyi Flow üzerinde withAttributes ile ekleyin.

import akka.stream.{ActorAttributes, Supervision}

val safe =
  Flow[String].map(_.toInt)
    .withAttributes(
      ActorAttributes.supervisionStrategy(_ => Supervision.Resume))

Flow'ları Birleştirme

Küçük Flow'lar via ile daha büyük Flow'larda birleştirilerek tek bir yeniden kullanılabilir Flow oluşturulabilir. Bu, her dönüşümün odaklanmış ve bağımsız olarak test edilebilir olmasını sağlar.

Birleştirilmiş Flow, ilk Flow'un girdi türüne ve son Flow'un çıktı türüne sahip olur.

val parse  = Flow[String].map(_.toInt)
val square = Flow[Int].map(n => n * n)

val parseAndSquare: Flow[String, Int, akka.NotUsed] =
  parse.via(square)

Hızlı Kontrol

Eşzamansız dönüşümleri ve bunların sıralama garantilerini düşünün.

Özet

Dönüşüm işleçlerini incelediniz: öğe bazlı map/filter, bire çok mapConcat, toplu işleme için grouped, scan ve fold ile biriktirme ve mapAsync ile eşzamansız işler.

Ayrıca durum tutan dönüşümleri, throttle gibi zamana dayalı işleçleri, hatalar için denetim stratejilerini ve Flow'ların via ile nasıl birleştirildiğini gördünüz. Sırada, geri basıncın bu aşamaları nasıl güvenli tuttuğu var.

Sıkça Sorulan Sorular

“Akışları Dönüştürme” dersi ücretsiz mi?

Evet — “Akışları Dönüştürme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Scala for Backend Engineering & Functional Programming kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Scala for Backend Engineering & Functional Programming kursu toplamda 4 dersten oluşur.

“Akışları Dönüştürme” dersinde ne öğreneceğim?

Akış hâlindeki verileri eşleyip filtreleyin. Scala for Backend Engineering & Functional Programming ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Scala for Backend Engineering & Functional Programming öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Scala for Backend Engineering & Functional Programming, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Akışları Dönüştürme” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Scala for Backend Engineering & Functional Programming dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Scala for Backend Engineering & Functional Programming dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Source, Flow ve Sink
  2. Akışları Dönüştürme
  3. Geri Basınç
  4. Bir İşlem Hattı Çalıştırma
← Scala for Backend Engineering & Functional Programming Sayfasına Dön