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


71

我有一个数组:

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

我必须过滤列表,所以只剩下一个"January"


请阐明您要从列表中删除“(一月)”(删除)或将列表过滤为仅具有“一月”的问题...答案在答案中的解释方式与实际含义相反。
杰森·米纳德

1
对于新的Kotlin开发人员来说,扫描STDLIB API参考指南是一个好主意,这样您就可以知道可以使用什么。 kotlinlang.org/api/latest/jvm/stdlib/index.html 如果来自Java 8流,则可以在stackoverflow.com/questions/34642254/…
Jayson Minard,

我需要过滤出一月份的月份。我已编辑问题
尼特(Nitt),

过滤还是过滤?
ctrl-alt-delor

Answers:


114

您可以使用此代码通过使用以下代码从数组中过滤掉一月

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 '17

3
这与请求相反,他们希望从列表中删除“ January”(而不是仅保留1月),请更新答案以使其正确,否则应将接受的答案移至zsmb13中的答案,这涵盖了两种情况。
杰森·米纳德

2
您可以使用以下方法进一步简化操作:month.single { s -> s == "January" }
Matthew Patience

如果您有一个自定义对象列表,而不仅仅是一些内置类型(如Int或String),它将如何改变?
Zonker.in.Geneva

37

有许多用于过滤集合的函数,如果您只想保留匹配的值"January",则可以使用simple 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参考


如何过滤出多个值?说,我想从列表中过滤掉“一月”和“三月”吗?
Lidia Hocke

5
你可以做类似的事情months.filter { it !in listOf("January", "March" }
zsmb13

17

您要过滤包含月份的字符串列表。

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()method,则它将返回一个值,并且如果列表中有多个值,则将引发异常。

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

这与要求的相反。
杰森·米纳德

该问题要求过滤月份,这意味着将其删除。您进行相反的操作,然后过滤所有月份。这个问题的措词应该更清楚地表达为“过滤月份”
Jayson Minard,

@JaysonMinard请立即检查答案。
阿维耶特·卡玛卡尔(Avijit Karmakar),

@JaysonMinard谢谢。答案看起来很棒。
Avijit Karmakar

9

我只是想分享一下,如果您有自定义列表,并检查它是否为空或空白,则可以单行在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
  }

注意:我假设label和valueCustom Model类的变量。


7

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

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

0

谓词过滤

    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!")
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.