Kotlin 优化使用过滤器获取前 n 个元素

Kos*_*arm 4 kotlin

我有一些list: List <Pet> 我需要从中获取满足条件的 3 个元素:

我这样做:

list.filter { g -> !mainList.contains(g) }.take(3)
Run Code Online (Sandbox Code Playgroud)

您如何优化此代码,以便为结果执行过滤操作的次数不超过足够的次数?

cac*_*acs 5

使用序列。而不是依次完全处理每个步骤(即创建一个新的过滤列表,然后从中取出 3 个元素)每个元素通过链,一次一个。这样你就不用创建中间列表了,只要到了满足你终止条件的元素就可以停止

list.asSequence()
    .filter { g -> !mainList.contains(g) }
    .take(3)
    .toList()
Run Code Online (Sandbox Code Playgroud)

请注意,您必须执行序列(toList在本例中为with )才能将其转换为具体的集合。

此外,正如链接所说,创建一个序列确实会引入大量开销,因此它不一定更有效-您会看到更大的集合、链中的更多步骤、过滤器函数等计算速度变慢的好处......任何真正减少内存使用或提前退出有意义的事情都会产生很大的不同。你应该对它进行基准测试,确保它是正确的做法!

另外作为奖励,您可以根据需要进行过滤操作filterNot(mainList::contains)

  • 编写过滤器的另一种方法是“filter{ it !in mainList }”。(我发现这种方式更容易阅读,也更短。YMMV,当然。) (2认同)