2017-10-21 195 views
1

這是我有什麼,我想要實現:爲什麼在mutableList上的.map實際上並沒有改變Kotlin中List的值?

  1. 我有具有mutableList作爲現場的一類。

  2. 我想找到該列表中的特定元素並進行更改。

這是我到目前爲止已經試過:

  1. 這是我希望的功能的語句會工作,之後我也把它放在一個擴展功能:

    fun Classroom.setNewParameters(id: String, modifiedName: String) { 
        this.students.filter { l -> l.id == id } 
           .map { l -> l.name = modifiedName } 
           .toList() 
    } 
    

    但是在調用該函數後,列表students看起來沒有改變。

  2. 我發現下面的代碼的「醜陋」的解決方案:

    fun Classroom.setNewParameters(id: String, modifiedName: String) { 
        for (l : Student in this.students) { 
         if (l.id == id) { 
          l.name = modifiedName 
          break 
         } 
        } 
    } 
    

不過壽,我真的很想知道爲什麼第一個代碼塊的行爲就像它沒有按和」實際上對列表有任何影響。

+0

我無法重現(但是你嚴重濫用map():沒有理由創建一個新列表來改變原始列表中的一個元素)。 https://gist.github.com/jnizet/a25b87ff33ca156f446adbc8d6548bac。發佈完整的最小程序來重現您的問題。 –

+0

@JBNizet是的,你是對的,那完全不是很酷。我不知道爲什麼我被困在.map中(真實情況稍微複雜一點,但仍然沒有意義使用.map)。我在下面發佈了一個很好的答案,但他刪除了它,無論如何他只是告訴我去'students.forEach({if(it.id == id)it.name = modifiedName})'這似乎工作得很好!你認爲這是一個好的解決方案嗎? –

+5

不,我想你應該使用'list.find {it.id == id} ?. name = modifiedName'。這就是匹配你的第二個代碼片段:用給定的id找到* first *元素,然後改變它的名字。 –

回答

0

您可以將map作爲轉換輸入以獲取新輸出的方式。通常情況下它不應該內部發生變異的狀態,換句話說,它應該是沒有副作用的功能追求可維護性

在你的情況,你顯然希望變異的元素,你可能想使用的代碼片段:

fun Classroom.setNewParameters(id: String, modifiedName: String) { 
    this.students.filter { l -> l.id == id } 
       .onEach { l -> l.name = modifiedName } 
} 

而且,即使你使用正確map應該必須修改現場l.name(除非你已經實現了你自己的代表或的getter/setter)。嘗試在上調試設置斷點,並查看過濾後是否還有剩餘項目

0

Noob here,但是我前幾天看到與此相關的內容。

是否有一個原因,你不會只是檢查,看看你的數組是否包含舊值,返回元素ID,然後分配你的新值到該ID?

我想我只是指出,這可以用「value in array」類型的搜索來完成......但我仍然太新以至於不知道使用它與地圖的優缺點。

的這樣一種之下,這是我從Kotlin - Idiomatic way to check array contains value


「值」 在陣列

它轉換到Java API有:

陣列。包含(「值」)


所以我檢查的舊值在數組中,返回它的索引,然後重新分配新值指標。

相關問題