Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kotlin Flow

Kotlin Flow

An early look at Kotlin Flow

José Caique Oliveira

June 21, 2019
Tweet

More Decks by José Caique Oliveira

Other Decks in Programming

Transcript

  1. produce(capacity = 20) { (0..10).forEach { send(it) println("sent $it") }

    } //emmit : 1,2,3 … val intFlow = flow { for (i in 0 until 10) { emit(i) println("sent flow $i") } } // intFlow.collect{ }
 // 1,2,3… HOT CHANNEL COLD STREAM implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0-M1'
  2. BUILDERS ▸ (0..2).asFlow() ▸ flow{ emit(1) } ▸ flowOf(1, 2,

    3, 4, 5) ▸ channelFlow { send(1) } ▸ emptyFlow<T>()
  3. (0..1).asFlow() .map { println("Thread0 ${Thread.currentThread().name}") it*it } .filter { println("Thread1

    ${Thread.currentThread().name}") it % 4 == 0 } .flowOn(Dispatchers.IO) .map { println("Thread2 ${Thread.currentThread().name}") it * 2 } .flowOn(Dispatchers.Default) Thread0 DefaultDispatcher-worker-2 Thread1 DefaultDispatcher-worker-2 Thread0 DefaultDispatcher-worker-2 Thread1 DefaultDispatcher-worker-2 Thread2 main
  4. //requestA(Flow) -> 1000L //requestB(Flow) -> 2000L requestA() .zip(requestB()) { requestA,

    requestB -> requestA + requestB }.collect { println(it) } Total: ~2100L
  5. //requestA(suspend) -> 1000L //requestB(suspend) -> 2000L channelFlow<Pair<Int, String>> { val

    result1 = async { requestA() } val result2 = async { requestB() } val result3 = result1.await() to result2.await() send(result3) }.collect { println(it) } // buffer, still cold stream Total: ~2100L
  6. val myFlow = flow { // GlobalScope.launch { // is

    prohibited // launch(Dispatchers.IO) { // is prohibited // withContext(CoroutineName("myFlow")) // is prohibited emit(1) // OK coroutineScope { emit(2) // OK -- still the same coroutine } }
  7. val broadcast: ConflatedBroadcastChannel<User> // emitting launch { broadcast.send(user) } //

    listening broadcast.consumeEach { service .retrieve(it) .map { it.getOrNull() } .collect { it?.let { … } } } //close broadcast.close()
  8. EXTENSIONS ‣ broadcastIn ‣ buffer ‣ collect ‣ combineLatest ‣

    conflate ‣ count ‣ debounce ‣ delayEach ‣ delayFlow ‣ distinctUntilChanged ‣ distinctUntilChangedBy ‣ drop ‣ dropWhile ‣ filter ‣ filterIsInstance ‣ filterNot ‣ filterNotNull ‣ first ‣ flatMapConcat ‣ flatMapMerge ‣ flattenConcat ‣ flattenMerge ‣ flowWith ‣ fold ‣ map ‣ mapNotNull ‣ onEach ‣ onErrorCollect ‣ onErrorReturn ‣ produceIn ‣ reduce ‣ retry ‣ sample ‣ scan ‣ scanFold ‣ scanReduce ‣ single ‣ singleOrNull ‣ switchMap ‣ take ‣ takeWhile ‣ toCollection ‣ toList ‣ toSet ‣ transform ‣ zip
  9. fun <T> Flow<T>.startWith(start: T) = flow { collect { value

    -> emit(start) emit(value) } } flowOf("Caique") .startWith("Jose") .collect { println(it) } 
 // José
 // Caique EASY TO CREATE EXTENSIONS
  10. JOSÉ CAIQUE ▸ Software Engineer ▸ Computer Science by UFS

    ▸ Android Tech Lead at Stone ▸ Speaker
  11. J C A I Q U E _ J O

    S E C A I Q U E J O S E C A I Q U E T H A N K S