2017-01-13 34 views
1

kotlin中是否有任何方法將下面兩行替換爲一個。我知道我可以創建一個擴展函數,但我很想知道它是否已經存在於kotlin中。類似於listOfChecklist.clearAndAddAll()在單個語句中列出清除並添加所有內容Kotlin

listOfChecklist.clear() 
listOfChecklist.addAll(newList) 

這就是我現在手動使用擴展功能所做的。但我希望有更好的解決方案。

fun <E> MutableCollection<E>.clearAndAddAll(replace: MutableSet<E>) { 
    clear() 
    addAll(replace) 
} 
+9

我希望沒有這樣的方法。 – miensol

+3

實際上並不相關,但有['retainAll'](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-mutable-list/retain-all.html)函數可以刪除所有項目不包含在另一個集合中,但它不會添加缺少的項目。 – hotkey

+0

@ s1m0nw1沒有這樣的方法。相反,您可以使用上述的擴展方法。 –

回答

-1

您可以從newList創建一個新實例。

listOfChecklist = ArrayList(newlist) 
+0

我不想再次初始化列表。我只想修改列表中的項目,而不是用新的替換整個列表。 –

+0

在這種情況下,擴展功能是您最好的選擇。 – Januson

3

這是不可能的。解決你的情況的慣用方法是使用示波器功能,如with。儘管如此,我並沒有看到很大的優勢。

val list = mutableListOf<String>() 

with(list){ 
    clear() 
    addAll(arrayListOf()) 
} 
1

我的回答將是頗具哲理,所以這裏是我的想法:

  1. 如果你真的覺得需要這2個操作合併成一行代碼,它表明你非常使用經常。

  2. 如果你經常使用這種設計模式,在我看來,你的應用程序/類的整體設計中有一些錯誤,在這裏我完全同意「我希望沒有這樣的方法」 @miensol。

  3. 如果你不經常使用它,我認爲把它放在兩行代碼上會使它更具可讀性。

  4. 清除「listOfChecklist」使得僅在「newlist」被在某些時候也清感,否則你只是保持如參考:「listOfChecklist = newlist」和繁榮!你完成了...

  5. 如果你使用可變列表很多,它們被清除並且它們的元素在彼此之間被複制,在我看來,它似乎是過度使用可變狀態,使你的代碼難以推理。我會建議看看一些核心函數式編程原則,它們將徹底擺脫clear/addAll方面的擔憂:-)。

  6. 我不是一個性能專家,但對於大多數使用情況,我並沒有真正看到重用現有列表而不是僅僅克隆它的合理好處(如果您確實需要保留某些元素原因),並談到性能本身,JVM幾乎總是做得很好。

結論:我的建議是要保持它在2行,如果你真的需要它或者設計代碼的方式讓你徹底避免清晰/中的addAll的需要。否則,您可以使用您的擴展功能或任何讓您感到快樂的方式。

相關問題