How to filter a list in-place with Kotlin?

后端 未结 3 1573
孤街浪徒
孤街浪徒 2021-02-02 08:26

In Java I can remove items from a list with this code:

private void filterList(List items) {
    Iterator iterator = items.iterator();
           


        
相关标签:
3条回答
  • 2021-02-02 08:45

    Just use .retainAll { ... } or .removeAll { ... }, both accepting a predicate, to filter it in-place:

    items.retainAll { shouldRetain(it) }
    

    items.removeAll { shouldRemove(it) }
    

    Note that items should be a MutableList<T> for that, not just List<T>, which is a read-only list in Kotlin and thus does not expose any mutating functions (see: Collections in the language reference).

    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.


    And if you don't want to modify the original list, you can produce a separate collection with only the items you want to retain using .filter { ... } or .filterNot { ... }, this will work for read-only List<T> as well:

    val filtered = items.filter { shouldRetain(it) }
    

    val filtered = items.filterNot { shouldRemove(it) }
    
    0 讨论(0)
  • 2021-02-02 08:53

    Kotlin has a lot of neat built-in functions. You can try to use filter here.

    val filteredItems = items.filter { checkItem(it) }  
    

    Unfortunately, it will recreate the list. This API was designed on purpose to avoid extra mutability.

    But if you still want to proceed with a MutableList use retainAll method

    items.retainAll { checkItem(it) }
    
    0 讨论(0)
  • 2021-02-02 08:57

    This will remove even numbers from the list 1-9, and prints [1, 3, 5, 7, 9]

    var myLists = mutableListOf(1,2,3,4,5,6,7,8,9)
    myLists.removeAll{ it % 2 == 0 }
    println(myLists)
    

    This will retain even numbers and remove others from the list 1-9, and prints [2, 4, 6, 8]

    myLists = mutableListOf(1,2,3,4,5,6,7,8,9)
    myLists.retainAll{ it % 2 == 0 }
    println(myLists)
    

    Try them in https://play.kotlinlang.org/

    0 讨论(0)
提交回复
热议问题