如何在Kotlin中过滤ArrayList,以便只有符合条件的元素?

106

我有一个数组:

var month: List<String> = arrayListOf("January", "February", "March")

我需要筛选列表,以便只剩下"January"


请澄清您想要从列表中过滤掉“January”(删除)的问题,还是仅过滤列表以仅包含“January”... 问题在答案中被解释成与有意义的相反的方式。 - Jayson Minard
1
对于新的 Kotlin 开发者来说,浏览 STDLIB API 参考指南是一个好主意,这样你就可以了解可用的内容。http://kotlinlang.org/api/latest/jvm/stdlib/index.html 如果你从 Java 8 流过来,你可以在 https://dev59.com/v1sW5IYBdhLWcg3wuZRy 中了解相应的内容。 - Jayson Minard
我需要过滤掉一月份的数据。我已经编辑了问题。 - Nitt
筛选进还是筛选出? - ctrl-alt-delor
6个回答

171

您可以使用此代码从数组中筛选出1月份,代码如下:

var month: List<String> = arrayListOf("January", "February", "March")
// to get the result as list
var monthList: List<String> = month.filter { s -> s == "January" }

// to get a string
var selectedMonth: String = month.filter { s -> s == "January" }.single()

7
请注意,在 Kotlin 中,您不必显式使用 .equals。更符合习惯的做法是直接使用 ==,这样就可以正确地执行操作。 - zienkikk
3
请求的相反,他们想要从列表中删除“一月”,而不是仅保留一月,请更新答案以使其正确,否则应将已接受的答案移至zsmb13的答案,该答案涵盖了两种情况。 - Jayson Minard
3
你可以使用以下代码进一步简化:month.single { s -> s == "January" } - Matthew Patience
如果您有一个自定义对象列表,而不仅仅是一些内置类型(如Int或String),那么这将如何改变? - Zonker.in.Geneva
2
更短的 month.single { it == "January" } - William Hu
当我只输入“J”时,如何显示列表项“January”? - ProAslan

46

有许多用于过滤集合的函数。如果你想保留与"January"相匹配的值,可以使用简单的filter()函数:

val months = listOf("January", "February", "March")

months.filter { month -> month == "January" } // with explicit parameter name
months.filter { it == "January" }             // with implicit parameter name "it"

这将为您提供一个仅包含 "January" 的列表。

如果您想要所有不是 "January" 的月份,您可以使用 != 条件反转,或者使用 filterNot() 方法:

months.filter { it != "January" }
months.filterNot { it == "January" } 

这将给你一个包含"February""March"的列表。

请注意,与Java不同,在Kotlin中使用==!=运算符实际上等同于在对象上调用equals函数。有关更多信息,请参见有关相等性的文档。

有关标准库中集合函数的完整列表,请参见API参考


我该如何筛选多个值?比如说,我想从列表中筛选出"January"和"March"两个值? - lidkxx
8
你可以这样做:months.filter { it !in listOf("January", "March") } - zsmb13

28

你想要筛选包含月份的字符串列表。

var month : List<String> = arrayListOf("January", "February", "March")
你可以使用列表的 filterNot() 方法。它返回一个除了满足给定谓词的元素以外的所有元素组成的列表。
var filteredMonthList : List<String> = month.filterNot { s -> s == "January" }
// results:  ["February", "March"]
你可以使用列表的 filter() 方法。它返回一个包含所有满足给定谓词的元素的列表。
var filteredMonthList : List<String> = month.filter { s -> s == "January" }
// results:  ["January"]

如果我们在filter()之后使用single()方法,它将返回一个单一的值,并且如果列表中有多个值,则会抛出异常。

var filteredMonth : String = month.filter { s -> s == "January" }.single()
// result:  "January"

这与所要求的相反。 - Jayson Minard
问题要求过滤月份,这意味着将其删除。你做的是相反的,过滤除了月份以外的所有内容。问题应该表述得更清楚一些,即“过滤掉月份”。 - Jayson Minard
@JaysonMinard 请现在检查答案。 - Avijit Karmakar
@JaysonMinard 谢谢。答案看起来很棒。 - Avijit Karmakar

12

我想分享一下,如果你有一个自定义列表并检查它是否为null或空白,你可以在Kotlin中用单行代码进行检查。 就像这样

我只是分享一下,如果你有自定义列表并且想要检查它是否为null或者为空,你可以在Kotlin中使用单行代码进行检查。 就像这样:
  fun filterList(listCutom: List<Custom>?) {
    var fiterList = listCutom!!.filter { it.label != "" }
    //Here you can get the list which is not having any kind of lable blank
  }

你也可以检查多个条件

 fun filterList(listCutom: List<Custom>?) {
    var fiterList = listCutom!!.filter { it.label != "" && it.value != ""}
    //Here you can get the list which is not having any kind of lable or value blank
  }

注意:我假设标签和值Custom模型类的变量。


标签是布尔类型,但我们仍然想检查该标签是否存在于列表中。不想使用默认情况。 - Anshul Tyagi

8

您还可以使用findfindLast。这专门用于仅返回一个值,而不是在使用filter时返回String列表。

var month = arrayListOf("January", "February", "March")
var result = month.find { s -> s == "January" }

5

按条件过滤

    val numbers = listOf("one", "two", "three", "four")
    var items: List<String> = numbers.filter { s -> s == "one" }

    var item = numbers.singleOrNull { it == "one" }

    if (item != null) {
        print("FOUND:$item")
    } else {
        print("Not FOUND!")
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接