ตัวดำเนินการ Flow: map, filter, transform และ take
ใช้ตัวดำเนินการระหว่างทางเพื่อแปลงและจำกัดการปล่อยค่าของ Flow
ตัวดำเนินการ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ตัวดำเนินการ Flow: map, filter, transform และ take
- catch และ onCompletion: การจัดการข้อผิดพลาดใน Flow
- combine และ zip: รวม Flow หลายสาย
- flowOn และ buffer: บริบทและแรงดันย้อนกลับ