A
102. 二叉树的层序遍历
描述: 给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
解法: 用1个队列记录1层的元素,然后遍历并将下1层的元素添加到队列里,直到遍历到最后1层。
R
主要讲了 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等同。
它可以接收两个参数。
-
methods: 该
action支持的请求方式,列表传递 -
detail: 表示是
action中要处理的是否是视图资源的对象(即是否通过 URL 路径获取主键)
S
这周比较忙,没时间写,暂停一周……