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

Kotlin使用过滤器优化前n个元素,kotlin,Kotlin,我有一些list:list 我需要从中提取满足条件的3个元素: 我是这样做的: list.filter { g -> !mainList.contains(g) }.take(3) 如何优化此代码,使筛选操作的执行次数不超过结果的执行次数?请使用。而不是依次完全处理每个步骤(即创建一个新的筛选列表,然后从中提取3个元素),每个元素通过链,一次一个。因此,您不需要创建中间列表,只要找到满足终止条件的元素,就可以立即停止 list.asSequence() .filter { g -

我有一些
list:list
我需要从中提取满足条件的3个元素:

我是这样做的:

list.filter { g -> !mainList.contains(g) }.take(3)
如何优化此代码,使筛选操作的执行次数不超过结果的执行次数?

请使用。而不是依次完全处理每个步骤(即创建一个新的筛选列表,然后从中提取3个元素),每个元素通过链,一次一个。因此,您不需要创建中间列表,只要找到满足终止条件的元素,就可以立即停止

list.asSequence()
    .filter { g -> !mainList.contains(g) }
    .take(3)
    .toList()
注意,您必须执行序列(在本例中使用
toList
)将其转换为具体的集合

此外,正如链接所说,创建序列确实会带来大量开销,因此它不一定更高效-您将看到更大的集合、链中的更多步骤、更慢的计算(如过滤函数)带来的好处。。。在任何有意义的事情上,尽可能减少内存使用或提前退出都会带来很大的不同。你应该对它进行基准测试,确保它是正确的


另外,如果您愿意,您的筛选操作可以是
filterNot(mainList::contains)

您可以将mainList元素的hashMap设置为true other,否则为null,之后使用filter with hashMap[g]==truemainList是一个集合,因此不需要在此处使用另一个映射OK然后使用for循环,如果您获得3个元素计数,则打破循环另一种编写过滤器的方法是
filter{it!in mainList}
。  (我觉得这种方式既简单又容易阅读。  哦,是的,那是一个好主意,我更喜欢它too@gidds但是,
filterNot(mainList::contains)
正如答案中所建议的那样甚至更好think@WilliMentzel对我来说,性能上的任何微小差异(如果有,我没有检查)更大的可读性和灵活性超过了它。@gidds我认为更可读的是这里的个人引用。关于灵活性,您是对的,但是当使用现代IDE(Intellij)时,这也不是一个真正的问题,因为他们可以在两种形式之间转换它。最后,我认为两者都可以,我只是更倾向于引用语法:)。