Cha*_*les 4 list filter kotlin
嘿,我正在寻找一个从列表中获取的函数:
[6, 54, 3, 6, 3]
Run Code Online (Sandbox Code Playgroud)
以下列表:
[0, 3]
Run Code Online (Sandbox Code Playgroud)
当我过滤 6 时。
到目前为止,我只找到了可以让我过滤第一次或最后一次出现的函数。
gid*_*dds 12
目前标准库中没有单独的函数来实现此目的,但很容易编写自己的函数,例如:
\nfun <E> Iterable<E>.indexesOf(e: E)\n = mapIndexedNotNull{ index, elem -> index.takeIf{ elem == e } }\nRun Code Online (Sandbox Code Playgroud)\n这适用于任何类型的任何列表、集合或其他可迭代对象,并返回List<Int>.\xe2\x80\x82 如果没有匹配项(例如,如果集合为空),则返回一个空列表。
这里mapIndexedNotNull()转换元素,仅返回非空元素。\xe2\x80\x82 并takeIf()用于仅获取匹配元素的索引,其余部分返回 null(然后将被丢弃)。
这应该是比较有效的;它对列表进行一次扫描,并仅创建一个包含结果的新列表。\xe2\x80\x82(如果临时对象是主要问题,您可能根本不会将匹配的索引存储在列表中,但只需用一些函数循环它们forEachMatchingIndex()即可。)
(感谢迈克尔提出的最初想法。)
\n更新:为了完整性,这里的版本可以找到满足任何提供的函数的元素:
\ninline fun <E> Iterable<E>.indexesOf(predicate: (E) -> Boolean)\n = mapIndexedNotNull{ index, elem -> index.takeIf{ predicate(elem) } }\nRun Code Online (Sandbox Code Playgroud)\n您可以使用它来查找所有偶数的索引:
\nlistOf(1, 2, 3, 4, 5, 6).indexesOf{ it % 2 == 0 } // [1, 3, 5]\nRun Code Online (Sandbox Code Playgroud)\n