如何调试Kotlin序列/集合

采取以下一行,可以表示为一个集合或序列上的一系列操作:

val nums = (10 downTo 1) // .asSequence() if we want this to be a sequence .filter { it % 2 == 0 } .map { it * it } .sorted() // .asList() if declaring it a sequence println(nums) // [4, 16, 36, 64, 100] 

比方说,我想看看每一步的元素,他们会(从扣除):

 [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] [10, 8, 6, 4, 2] [100, 64, 36, 16, 4] [4, 16, 36, 64, 100] 

不幸的是,没有好的方法来用调试器进行调试,或者记录这些值以供日后检查。 有了良好的函数式编程结构,整个方法可以被重写为这样的单个语句,但似乎没有好的办法来检查中间状态,甚至计数(这里的10,5,5,5)。

什么是调试这些最好的方法?

您可以记录中间值(列表)

 fun <T> T.log(): T { println(this); this } //USAGE: val nums = (10 downTo 1) .filter { it % 2 == 0 }.log() .map { it * it }.log() .sorted().log() 

这将按需要工作,因为在你的例子中你使用集合,而不是序列。 对于懒Sequence你需要:

 // coming in 1.1 public fun <T> Sequence<T>.onEach(action: (T) -> Unit): Sequence<T> { return map { action(it) it } } fun <T> Sequence<T>.log() = onEach {print(it)} //USAGE: val nums = (10 downTo 1).asSequance() .filter { it % 2 == 0 } .map { it * it }.log() .sorted() .toList() 

在最新的Intellij Idea中添加断点时,您可以选择将其设置为不检查整个表达式,而仅检查Lambda体。

在这里输入图像描述

然后在调试中你可以看到你的Lambda里面发生了什么。

在这里输入图像描述

但这不是唯一的方法。 您也可以使用运行光标(Alt + F9) 。