ARTS - 7

320 阅读2分钟

A


102. 二叉树的层序遍历

描述: 给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。

解法: 用1个队列记录1层的元素,然后遍历并将下1层的元素添加到队列里,直到遍历到最后1层。

R


How to Combine Kotlin Flows

主要讲了 Flow 相关的几个组合运算符。

Combine

Flow<T1>.combine(
    flow: Flow<T2>,
    transform: suspend (a: T1, b: T2) -> R
): Flow<R> (source)

fun flowsWithCombine() = runBlocking {
    val numbersFlow = flowOf(1, 2, 3).delayEach(1000)
    val lettersFlow = flowOf("A", "B", "C").delayEach(2000)
    numbersFlow.combine(lettersFlow) { number, letter ->
        "$number$letter"
    }.collect {
        println(it)
    }
}

使用 Combine 组合后,任意1个流触发时,combine 都会从2个 Flow 中取得新状态,并以此为参数调用 lambda 函数。

Zip

public fun <T1, T2, R> Flow<T1>.zip(
    other: Flow<T2>,
    transform: suspend (T1, T2) -> R): Flow<R> = zipImpl(this, other, transform)

numbersFlow.zip(lettersFlow) { number, letter ->
    "$number$letter"
}.collect {
    println(it)
}

Zip 会等待两个 Flow 都触发后才获取数据并调用 lambda 。

flattenMerge

public fun <T> Flow<Flow<T>>.flattenMerge(concurrency: Int = DEFAULT_CONCURRENCY): Flow<T> {
    require(concurrency > 0) { "Expected positive concurrency level, but had $concurrency" }
    return if (concurrency == 1) flattenConcat() else ChannelFlowMerge(this, concurrency)
}

flowOf(numbersFlow, lettersFlow).flattenMerge().collect {
    println("smapletracing $it")
}

flattenMerge 和上面两个不同,它是将两个 Flow 合成了1个。每个 Flow 的触发都会触发 flattenMerge ,但是不会组合两个 Flow 的值,而是只使用当前触发的 Flow 的值。

Output
1
2
A
3
B
C

T


@action

Django REST framework 里的 @action 可以为 ViewSet 里的自定义方法做注解。

action 装饰器装饰的方法名会作为 action动作名,与list、retrieve等同。

它可以接收两个参数。

  1. methods: 该 action支持的请求方式,列表传递

  2. detail: 表示是 action中要处理的是否是视图资源的对象(即是否通过 URL 路径获取主键)

S


这周比较忙,没时间写,暂停一周……