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

Kotlin Flow

Kotlin Flow

An early look at Kotlin Flow

Avatar for José Caique Oliveira

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