如何使用 Kotlin 就地过滤列表?

2024-04-02

在 Java 中,我可以使用以下代码从列表中删除项目:

private void filterList(List<Item> items) {
    Iterator<Item> iterator = items.iterator();
    while (iterator.hasNext()) {
        if (checkItem(iterator.next())) {
            iterator.remove();
        }
    }
}

如何在 Kotlin 中进行相同的操作(即删除List无需重新创建)?


只需使用.retainAll { ... } https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/retain-all.html or .removeAll { ... } https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/remove-all.html,都接受谓词,以就地过滤它:

items.retainAll { shouldRetain(it) }
items.removeAll { shouldRemove(it) }

注意items应该是一个MutableList<T>为此,不仅仅是List<T>,这是 Kotlin 中的只读列表,因此不会公开任何变异函数(请参阅:收藏 https://kotlinlang.org/docs/reference/collections.html#collections在语言参考中)。

By the way, these two function are implemented efficiently for lists that support random access: then the list is not compacted after each item is removed (O(n2) time worst-case), and instead the items are moved within the list as it is processed, giving O(n) time.


如果您不想修改原始列表,您可以使用以下命令生成一个单独的集合,其中仅包含您想要保留的项目.filter { ... } https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/filter.html or .filterNot { ... } https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/filter-not.html,这适用于只读List<T>还有:

val filtered = items.filter { shouldRetain(it) }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Kotlin 就地过滤列表? 的相关文章

  • 移动列表中特定元素的简单函数

    我是 Haskell 的新手 我正在尝试弄清楚如何创建一个函数 shift Eq a gt a gt a gt Int gt a shift x h t z 输入 一个通用列表和一个相同类型的元素 x 前提条件 元素x存在于列表中 Outp
  • 作用域函数 apply/with/run/also/let:它们的名字从何而来?

    有很多博客文章 例如this https dzone com articles examining kotlins also apply let run and with intentions 关于标准库函数的用法apply with ru
  • Typealias - 在 Kotlin 中组合多个接口

    我对 Kotlin 中的协议组合有点生疏 我只想通过声明自定义来组合多个接口typealias This doesn t work typealias MyType ReadableInterface WritableInterface 有
  • “android.enableUnitTestBinaryResources”已弃用[重复]

    这个问题在这里已经有答案了 我刚刚更新了我的 Android Studio 现在当我构建我的项目时 我收到此错误 选项 android enableUnitTestBinaryResources 已弃用 这 当前默认值为 假 已从当前版本中
  • 递归地更改R中嵌套列表中的名称

    我在 R 中的嵌套列表结构中有数据 我想使用查找表来更改名称 无论它们在结构中的位置 例子 build up an example x lt as list c a NA x 1 lt vector list 4 names x 1 lt
  • Python 用 lambda 函数封闭作用域变量

    我写了这个简单的代码 def makelist L for i in range 5 L append lambda x i x return L 好的 现在我打电话 mylist makelist 因为稍后调用嵌套函数时会查找封闭范围变量
  • 使用 ocaml List.fold_left 列表中的最后一个元素

    我可以通过以下代码找到列表的最后一个元素 let last xs a list a let rec aux xs prev match xs with gt prev x ys gt aux ys x in match xs with gt
  • 如何将java库添加到kotlin本机

    所以我尝试使用intellij创建kotlin native应用程序 我在项目创建中选择了模板kotlin gt kotlin native 它创建了示例 gradle hello world 项目 下载所有依赖项后编译为exe文件并正常运
  • LiveData无法观察到变化

    我正在更新一个ViewModel 中 DialogFragment 的 LiveData 值 但无法获取Fragment中的值 视图模型 class OtpViewModel private val otpUseCase OtpUseCas
  • 比较通用列表和数组

    为什么 generic list 比 array 慢 通用列表比数组稍慢 但在大多数情况下您不会注意到 主要与稍微复杂的查找有关 据说 List 在幕后 使用数组 但不能保证以与数组相同的方式将节点保留在相邻内存中 然而 我早在 2005
  • 在 C# 中枚举时从 List 中删除项目的智能方法

    我有一个经典的案例 尝试从集合中删除一个项目 同时在循环中枚举它 List
  • python 和回文

    我最近写了一个循环的方法 usr share dict words并使用我的返回回文列表ispalindrome x 方法 这是一些代码 有什么问题吗 它只会停止 10 分钟 然后返回文件中所有单词的列表 def reverse a ret
  • 如何在 Python 中从平面列表构建嵌套列表? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有一个简单的列表 例如 flat 1 1 1 1 1 1 1 2 2 2 1 2 2 3 我需要转换为嵌套列表 其中每个级别 破折号后跟数
  • Python如何拆分列表列表?

    我有一个清单清单 myList 1 2 3 4 5 6 7 8 9 10 我想将其分成三个单独的列表 每个列表都有自己的名称 a 1 2 3 b 4 5 6 c 7 8 9 10 我该怎么做呢 您可以直接解压它 a b c myList
  • kotlin中的三元运算符[重复]

    这个问题在这里已经有答案了 我可以用java写 int i 10 String s i 10 Ten Empty 即使我可以将它传递到方法参数中 callSomeMethod i 10 Ten Empty 如何将其转换为 kotlin 在
  • 尝试使用资源/使用/多个资源

    我使用的 Java API 大量使用了 Autoclosable Interface 因此在 Java try with resources 中 然而在Java中你可以指定 try res1 res2 res3 我们有办法使用多种资源吗 它
  • 比较和删除列表和数组java中不存在的元素

    我有一个String数组和一List
  • Java 中的撤消和重做实现

    我想问一个关于Java中List的问题 很容易实现列表中元素的删除 添加和搜索 但是Java中如何实现列表的撤销和重做呢 谁可以帮我这个事 您可能希望实施一个Command Design Pattern为了这 一个不错的简化示例List可以
  • 在Python中将整数附加到列表的开头[重复]

    这个问题在这里已经有答案了 如何在列表的开头添加一个整数 1 2 3 42 1 2 3 gt gt gt x 42 gt gt gt xs 1 2 3 gt gt gt xs insert 0 x gt gt gt xs 42 1 2 3
  • Android Mockito.verify 说参数不同!打印相同内容

    情况 我有一个界面Tracker其中有这个方法 fun trackEvent event String args Bundle null 我想验证是否使用特定的调用此方法event 被测试的内部对象调用此方法Bundle目的 所有事件都指定

随机推荐