Kotlin Academy · บทเรียน

ตัวดำเนินการ Flow: map, filter, transform และ take

ใช้ตัวดำเนินการระหว่างทางเพื่อแปลงและจำกัดการปล่อยค่าของ Flow

บทเรียน 1 จาก 413 ขั้นตอน

ตัวดำเนินการ Flow: map, filter, transform และ take เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

Flow คืออะไร

Flow คือกระแสข้อมูลแบบอะซิงโครนัสที่เย็น ตัวดำเนินการระดับกลางอย่าง map filter และ transform ทำงานแบบขี้เกียจ โดยจะทำงานเมื่อมีการรวบรวมข้อมูลเท่านั้น

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun numbers(): Flow<Int> = flow {
    repeat(5) { emit(it + 1) }
}
fun main() = runBlocking {
    numbers().collect { println(it) }
}

ตัวดำเนินการ map

map แปลงค่าที่ถูกส่งออกมาแต่ละค่า เป็นการแปลงแบบหนึ่งต่อหนึ่งที่ใช้การทำงานแบบขี้เกียจ

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
    (1..5).asFlow()
        .map { it * it }
        .collect { println(it) } // 1 4 9 16 25
}

ตัวดำเนินการ filter

filter จะส่งต่อเฉพาะสมาชิกที่ตรงกับเงื่อนไข และตัดสมาชิกที่เหลือออก

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
    (1..10).asFlow()
        .filter { it % 2 == 0 }
        .collect { println(it) } // 2 4 6 8 10
}

ตัวดำเนินการ transform

transform เป็นตัวดำเนินการที่ทั่วไปที่สุด คุณสามารถส่งค่าออกมาเป็นศูนย์ หนึ่งค่า หรือหลายค่าต่อสมาชิกอินพุตหนึ่งรายการ

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
    (1..3).asFlow()
        .transform { n ->
            emit("Item $n")
            emit("Done $n")
        }
        .collect { println(it) }
}

ตัวดำเนินการ take

take(n) จะรับเฉพาะสมาชิก n รายการแรก แล้วจึงยกเลิกโฟลว์ต้นทาง

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
    flow {
        repeat(100) { emit(it) }
    }.take(3)
     .collect { println(it) } // 0 1 2
}

takeWhile และ dropWhile

takeWhile จะรับสมาชิกตราบใดที่เงื่อนไขยังเป็นจริง ส่วน dropWhile จะตัดสมาชิกออกจนกว่าเงื่อนไขจะเป็นเท็จ

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
    (1..10).asFlow()
        .takeWhile { it < 5 }
        .collect { println(it) } // 1 2 3 4

    (1..10).asFlow()
        .dropWhile { it < 5 }
        .collect { println(it) } // 5 6 7 8 9 10
}

การเชื่อมตัวดำเนินการ

ตัวดำเนินการสามารถประกอบเข้าด้วยกันได้ โดยแต่ละตัวจะคืนค่า Flow ใหม่ ทำให้สร้างกระบวนการประมวลผลแบบประกาศได้

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
    (1..20).asFlow()
        .filter { it % 3 == 0 }
        .map { it * 2 }
        .take(4)
        .collect { println(it) } // 6 12 18 24
}

mapNotNull

mapNotNull จะแปลงค่าและตัดผลลัพธ์ที่เป็น null ออกในขั้นตอนเดียว ซึ่งเทียบเท่ากับ map + filter { it != null }

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
    flowOf("1", "two", "3", "four", "5")
        .mapNotNull { it.toIntOrNull() }
        .collect { println(it) } // 1 3 5
}

flatMapConcat

flatMapConcat จะแปลงสมาชิกแต่ละรายการให้เป็นโฟลว์ แล้วนำผลลัพธ์มาต่อกันตามลำดับ

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
    (1..3).asFlow()
        .flatMapConcat { n -> flowOf("$n-a", "$n-b") }
        .collect { println(it) }
}

onEach สำหรับผลข้างเคียง

onEach จะทำผลข้างเคียงกับสมาชิกแต่ละรายการโดยไม่เปลี่ยนกระแสข้อมูล เหมาะสำหรับการบันทึกหรือการวิเคราะห์ในกระบวนการประมวลผล

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
    (1..5).asFlow()
        .onEach { println("Processing: $it") }
        .filter { it % 2 == 0 }
        .collect { println("Collected: $it") }
}

Flow เป็นแบบเย็น

การเรียก collect แต่ละครั้งจะเริ่มโฟลว์ใหม่ตั้งแต่ต้น จะไม่มีสมาชิกใดถูกส่งออกหรือแปลงค่าจนกว่าตัวดำเนินการปลายทางจะเริ่มการรวบรวมข้อมูล

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
    val flow = (1..3).asFlow().map { println("map $it"); it * 2 }
    println("Before collect")
    flow.collect { println("got $it") }
    println("Second collect:")
    flow.collect { println("got $it") }  // runs again
}

ตรวจสอบอย่างรวดเร็ว

ตัวดำเนินการใดส่งค่าออกมาเป็นศูนย์ หนึ่งค่า หรือหลายค่าต่อสมาชิกต้นทางหนึ่งรายการ

ทบทวน

map แปลงค่าแบบหนึ่งต่อหนึ่ง filter ตัดสมาชิกออก transform ส่งค่าออกมาได้หลายจำนวน และ take จำกัดจำนวนรายการ คุณสามารถเชื่อมตัวดำเนินการเหล่านี้แบบประกาศได้ โดยโฟลว์เป็นแบบเย็นและจะทำงานเมื่อมีการรวบรวมข้อมูลเท่านั้น

เริ่มต้นได้ฟรี

เรียนรู้ Kotlin ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
51
บทเรียน
203

คำถามที่พบบ่อย

บทเรียน “ตัวดำเนินการ Flow: map, filter, transform และ take” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ตัวดำเนินการ Flow: map, filter, transform และ take” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ตัวดำเนินการ Flow: map, filter, transform และ take”

ใช้ตัวดำเนินการระหว่างทางเพื่อแปลงและจำกัดการปล่อยค่าของ Flow คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “ตัวดำเนินการ Flow: map, filter, transform และ take” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม

ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ตัวดำเนินการ Flow: map, filter, transform และ take
  2. catch และ onCompletion: การจัดการข้อผิดพลาดใน Flow
  3. combine และ zip: รวม Flow หลายสาย
  4. flowOn และ buffer: บริบทและแรงดันย้อนกลับ
← กลับไปที่ Kotlin Academy