【Koltin Flow(一)】五种创建flow的方式
【Koltin Flow(二)】Flow操作符之末端操作符
【Koltin Flow(三)】Flow操作符之中间操作符(一)
【Koltin Flow(三)】Flow操作符之中间操作符(二)
【Koltin Flow(三)】Flow操作符之中间操作符(三)
val flow = flow {
repeat(10){
delay(10)
emit(it)
}
}
flow.map {
"map $it"
}.collect {
Log.d(TAG.TAG,it)
}
flow.mapLatest {
delay(15)
"mapLatest $it"
}.collect {
Log.d(TAG.TAG,it)
}
flow.mapNotNull {
if (it % 2 == 0){
"mapNotNull $it"
}else{
null
}
}.collect {
Log.d(TAG.TAG,it)
}
2022-07-29 15:37:01.824 10589-10614/edu.test.demo D/Test-TAG: map 0
2022-07-29 15:37:01.836 10589-10614/edu.test.demo D/Test-TAG: map 1
2022-07-29 15:37:01.853 10589-10614/edu.test.demo D/Test-TAG: map 2
2022-07-29 15:37:01.865 10589-10614/edu.test.demo D/Test-TAG: map 3
2022-07-29 15:37:01.880 10589-10614/edu.test.demo D/Test-TAG: map 4
2022-07-29 15:37:01.892 10589-10614/edu.test.demo D/Test-TAG: map 5
2022-07-29 15:37:01.904 10589-10614/edu.test.demo D/Test-TAG: map 6
2022-07-29 15:37:01.915 10589-10614/edu.test.demo D/Test-TAG: map 7
2022-07-29 15:37:01.926 10589-10614/edu.test.demo D/Test-TAG: map 8
2022-07-29 15:37:01.937 10589-10614/edu.test.demo D/Test-TAG: map 9
2022-07-29 15:37:02.108 10589-10617/edu.test.demo D/Test-TAG: mapLatest 9
2022-07-29 15:37:02.128 10589-10615/edu.test.demo D/Test-TAG: mapNotNull 0
2022-07-29 15:37:02.149 10589-10615/edu.test.demo D/Test-TAG: mapNotNull 2
2022-07-29 15:37:02.171 10589-10615/edu.test.demo D/Test-TAG: mapNotNull 4
2022-07-29 15:37:02.196 10589-10615/edu.test.demo D/Test-TAG: mapNotNull 6
2022-07-29 15:37:02.218 10589-10615/edu.test.demo D/Test-TAG: mapNotNull 8
val flow = flow {
repeat(10){
delay(10)
emit(it)
}
}
flow.transform {
delay(1000)
emit(it*10)
}.collect {
Log.d(TAG.TAG,"transform is $it")
}
flow.transformLatest {
delay(1000)
emit("transformLatest $it")
}.collect {
Log.d(TAG.TAG,it)
}
flow.transformWhile {
emit("transformWhile $it")
it!=5
}.collect {
Log.d(TAG.TAG,it)
}
2022-07-29 15:37:03.243 10589-10615/edu.test.demo D/Test-TAG: transform is 0
2022-07-29 15:37:04.255 10589-10615/edu.test.demo D/Test-TAG: transform is 10
2022-07-29 15:37:05.269 10589-10615/edu.test.demo D/Test-TAG: transform is 20
2022-07-29 15:37:06.281 10589-10615/edu.test.demo D/Test-TAG: transform is 30
2022-07-29 15:37:07.294 10589-10615/edu.test.demo D/Test-TAG: transform is 40
2022-07-29 15:37:08.306 10589-10615/edu.test.demo D/Test-TAG: transform is 50
2022-07-29 15:37:09.318 10589-10615/edu.test.demo D/Test-TAG: transform is 60
2022-07-29 15:37:10.330 10589-10615/edu.test.demo D/Test-TAG: transform is 70
2022-07-29 15:37:11.341 10589-10615/edu.test.demo D/Test-TAG: transform is 80
2022-07-29 15:37:12.353 10589-10615/edu.test.demo D/Test-TAG: transform is 90
2022-07-29 15:37:13.470 10589-10617/edu.test.demo D/Test-TAG: transformLatest 9
2022-07-29 15:37:13.483 10589-10617/edu.test.demo D/Test-TAG: transformWhile 0
2022-07-29 15:37:13.495 10589-10617/edu.test.demo D/Test-TAG: transformWhile 1
2022-07-29 15:37:13.509 10589-10617/edu.test.demo D/Test-TAG: transformWhile 2
2022-07-29 15:37:13.521 10589-10617/edu.test.demo D/Test-TAG: transformWhile 3
2022-07-29 15:37:13.532 10589-10617/edu.test.demo D/Test-TAG: transformWhile 4
2022-07-29 15:37:13.544 10589-10617/edu.test.demo D/Test-TAG: transformWhile 5
val flow1 = (1..5).asFlow()
flow1.runningFold(10) { accumulator, value ->
Log.d(TAG.TAG, "accumulator $accumulator,$value")
accumulator + value
}.collect {
Log.d(TAG.TAG, "runningFold $it")
}
flow1.runningReduce { accumulator, value ->
accumulator + value
}.collect {
Log.d(TAG.TAG, "runningReduce $it")
}
2022-08-02 09:48:02.452 2984-3010/edu.test.demo D/Test-TAG: runningFold 10
2022-08-02 09:48:02.453 2984-3010/edu.test.demo D/Test-TAG: runningFold 11
2022-08-02 09:48:02.453 2984-3010/edu.test.demo D/Test-TAG: runningFold 13
2022-08-02 09:48:02.453 2984-3010/edu.test.demo D/Test-TAG: runningFold 16
2022-08-02 09:48:02.453 2984-3010/edu.test.demo D/Test-TAG: runningFold 20
2022-08-02 09:48:02.453 2984-3010/edu.test.demo D/Test-TAG: runningFold 25
2022-08-02 09:48:02.455 2984-3010/edu.test.demo D/Test-TAG: runningReduce 1
2022-08-02 09:48:02.455 2984-3010/edu.test.demo D/Test-TAG: runningReduce 3
2022-08-02 09:48:02.455 2984-3010/edu.test.demo D/Test-TAG: runningReduce 6
2022-08-02 09:48:02.455 2984-3010/edu.test.demo D/Test-TAG: runningReduce 10
2022-08-02 09:48:02.455 2984-3010/edu.test.demo D/Test-TAG: runningReduce 15
val flow = flow {
repeat(10){
delay(10)
emit(it)
}
}
flow.filter {
it % 2 == 0
}.collect {
Log.d(TAG.TAG,"filter $it")
}
flow.filterNot {
it % 2 == 0
}.collect {
Log.d(TAG.TAG,"filterNot $it")
}
flow {
emit(1)
emit("123")
}.filterIsInstance<String>().collect {
Log.d(TAG.TAG,"filterIsInstance $it")
}
flow {
emit(1)
emit(null)
emit(2)
}.filterNotNull().collect {
Log.d(TAG.TAG,"filterNotNull $it")
}
2022-07-29 15:50:45.376 10675-10703/edu.test.demo D/Test-TAG: filter 0
2022-07-29 15:50:45.400 10675-10703/edu.test.demo D/Test-TAG: filter 2
2022-07-29 15:50:45.422 10675-10703/edu.test.demo D/Test-TAG: filter 4
2022-07-29 15:50:45.444 10675-10703/edu.test.demo D/Test-TAG: filter 6
2022-07-29 15:50:45.466 10675-10703/edu.test.demo D/Test-TAG: filter 8
2022-07-29 15:50:45.505 10675-10703/edu.test.demo D/Test-TAG: filterNot 1
2022-07-29 15:50:45.528 10675-10703/edu.test.demo D/Test-TAG: filterNot 3
2022-07-29 15:50:45.550 10675-10703/edu.test.demo D/Test-TAG: filterNot 5
2022-07-29 15:50:45.574 10675-10703/edu.test.demo D/Test-TAG: filterNot 7
2022-07-29 15:50:45.597 10675-10703/edu.test.demo D/Test-TAG: filterNot 9
2022-07-29 15:50:45.598 10675-10703/edu.test.demo D/Test-TAG: filterIsInstance 123
2022-07-29 15:50:45.600 10675-10703/edu.test.demo D/Test-TAG: filterNotNull 1
2022-07-29 15:50:45.600 10675-10703/edu.test.demo D/Test-TAG: filterNotNull 2
val flow = flow {
repeat(10){
delay(10)
emit(it)
}
}
flow.take(5).collect {
Log.d(TAG.TAG,"take $it")
}
flow.takeWhile {
it < 5
}.collect {
Log.d(TAG.TAG,"takeWhile $it")
}
flow.drop(5).collect {
Log.d(TAG.TAG,"drop $it")
}
flow.dropWhile {
it < 5
}.collect {
Log.d(TAG.TAG,"dropWhile $it")
}
2022-07-29 16:04:08.109 11070-11096/edu.test.demo D/Test-TAG: take 0
2022-07-29 16:04:08.120 11070-11096/edu.test.demo D/Test-TAG: take 1
2022-07-29 16:04:08.132 11070-11096/edu.test.demo D/Test-TAG: take 2
2022-07-29 16:04:08.144 11070-11096/edu.test.demo D/Test-TAG: take 3
2022-07-29 16:04:08.169 11070-11096/edu.test.demo D/Test-TAG: take 4
2022-07-29 16:04:08.184 11070-11096/edu.test.demo D/Test-TAG: takeWhile 0
2022-07-29 16:04:08.197 11070-11096/edu.test.demo D/Test-TAG: takeWhile 1
2022-07-29 16:04:08.207 11070-11096/edu.test.demo D/Test-TAG: takeWhile 2
2022-07-29 16:04:08.218 11070-11096/edu.test.demo D/Test-TAG: takeWhile 3
2022-07-29 16:04:08.229 11070-11096/edu.test.demo D/Test-TAG: takeWhile 4
2022-07-29 16:04:08.320 11070-11096/edu.test.demo D/Test-TAG: drop 5
2022-07-29 16:04:08.332 11070-11096/edu.test.demo D/Test-TAG: drop 6
2022-07-29 16:04:08.343 11070-11096/edu.test.demo D/Test-TAG: drop 7
2022-07-29 16:04:08.355 11070-11096/edu.test.demo D/Test-TAG: drop 8
2022-07-29 16:04:08.366 11070-11096/edu.test.demo D/Test-TAG: drop 9
2022-07-29 16:04:08.435 11070-11096/edu.test.demo D/Test-TAG: dropWhile 5
2022-07-29 16:04:08.446 11070-11096/edu.test.demo D/Test-TAG: dropWhile 6
2022-07-29 16:04:08.457 11070-11096/edu.test.demo D/Test-TAG: dropWhile 7
2022-07-29 16:04:08.467 11070-11096/edu.test.demo D/Test-TAG: dropWhile 8
2022-07-29 16:04:08.478 11070-11096/edu.test.demo D/Test-TAG: dropWhile 9
flow{
emit(1)
emit(2)
emit(5)
emit(1)
emit(2)
}.takeWhile {
it<5
}.collect {
Log.d(TAG.TAG,"takeWhile $it")
}
2022-07-29 16:04:08.087 11070-11096/edu.test.demo D/Test-TAG: takeWhile 1
2022-07-29 16:04:08.087 11070-11096/edu.test.demo D/Test-TAG: takeWhile 2
// Internal building block for non-tailcalling flow-truncating operators
internal suspend inline fun <T> Flow<T>.collectWhile(crossinline predicate: suspend (value: T) -> Boolean) {
val collector = object : FlowCollector<T> {
override suspend fun emit(value: T) {
// Note: we are checking predicate first, then throw. If the predicate does suspend (calls emit, for example)
// the the resulting code is never tail-suspending and produces a state-machine
if (!predicate(value)) {
//此处predicate如果返回false直接抛出异常
throw AbortFlowException(this)
}
}
}
try {
collect(collector)
} catch (e: AbortFlowException) {
e.checkOwnership(collector)
}
}
flow {
emit(1)
delay(10)
emit(2)
delay(1000)
emit(100)
delay(500)
emit(200)
}.debounce(1000).collect {
Log.d(TAG.TAG,"debounce $it")
}
flow {
emit(1)
delay(400)
emit(2)
delay(400)
emit(100)
emit(200)
delay(200)
}.sample(500).collect {
Log.d(TAG.TAG,"sample $it")
}
2022-08-01 10:10:12.716 3651-3679/edu.test.demo D/Test-TAG: debounce 2
2022-08-01 10:10:13.221 3651-3679/edu.test.demo D/Test-TAG: debounce 200
2022-08-01 10:10:13.724 3651-3679/edu.test.demo D/Test-TAG: sample 2
2022-08-01 10:10:14.226 3651-3679/edu.test.demo D/Test-TAG: sample 200
flow {
emit(1)
emit(2)
emit(3)
emit(1)
emit(1)
emit(1)
}.distinctUntilChanged().collect {
Log.d(TAG.TAG,"distinctUntilChanged $it")
}
flow {
emit(1)
emit(2)
emit(3)
emit(1)
emit(1)
emit(1)
}.distinctUntilChanged { old, new ->
old > new
}.collect {
Log.d(TAG.TAG,"distinctUntilChanged(old, new) $it")
}
flow {
emit(1)
emit(2)
emit(3)
emit(1)
emit(1)
emit(1)
}.distinctUntilChangedBy {
it
}.collect {
Log.d(TAG.TAG,"distinctUntilChangedBy $it")
}
2022-08-01 10:33:56.073 4332-4359/edu.test.demo D/Test-TAG: distinctUntilChanged 1
2022-08-01 10:33:56.073 4332-4359/edu.test.demo D/Test-TAG: distinctUntilChanged 2
2022-08-01 10:33:56.074 4332-4359/edu.test.demo D/Test-TAG: distinctUntilChanged 3
2022-08-01 10:33:56.074 4332-4359/edu.test.demo D/Test-TAG: distinctUntilChanged 1
2022-08-01 10:33:56.074 4332-4359/edu.test.demo D/Test-TAG: distinctUntilChanged(old, new) 1
2022-08-01 10:33:56.075 4332-4359/edu.test.demo D/Test-TAG: distinctUntilChanged(old, new) 2
2022-08-01 10:33:56.075 4332-4359/edu.test.demo D/Test-TAG: distinctUntilChanged(old, new) 3
2022-08-01 10:33:56.075 4332-4359/edu.test.demo D/Test-TAG: distinctUntilChangedBy 1
2022-08-01 10:33:56.076 4332-4359/edu.test.demo D/Test-TAG: distinctUntilChangedBy 2
2022-08-01 10:33:56.076 4332-4359/edu.test.demo D/Test-TAG: distinctUntilChangedBy 3
2022-08-01 10:33:56.076 4332-4359/edu.test.demo D/Test-TAG: distinctUntilChangedBy 1