Javaでは、次のことができます。
public class TempClass {
List<Integer> myList = null;
void doSomething() {
myList = new ArrayList<>();
myList.add(10);
myList.remove(10);
}
}
しかし、以下のように直接Kotlinに書き換えると
class TempClass {
var myList: List<Int>? = null
fun doSomething() {
myList = ArrayList<Int>()
myList!!.add(10)
myList!!.remove(10)
}
}
私のリストからadd
とremove
関数が見つからないというエラーが出ました
私はそれをArrayListにキャストすることを回避しますが、それをキャストする必要があるのは奇妙なことですが、Javaではキャストは必要ありません。そして、それは抽象クラスListを持つ目的を無効にします
class TempClass {
var myList: List<Int>? = null
fun doSomething() {
myList = ArrayList<Int>()
(myList!! as ArrayList).add(10)
(myList!! as ArrayList).remove(10)
}
}
Javaでできることのように、私がListを使うがそれをキャストする必要がない方法はありますか?
多くの言語とは異なり、Kotlinは可変コレクションと不変コレクション(リスト、セット、マップなど)を区別します。コレクションをいつ編集できるかを正確に制御することは、バグを排除し、優れたAPIを設計するのに役立ちます。
https://kotlinlang.org/docs/reference/collections.html
MutableList
リストを使う必要があるでしょう。
class TempClass {
var myList: MutableList<Int> = mutableListOf<Int>()
fun doSomething() {
// myList = ArrayList<Int>() // initializer is redundant
myList.add(10)
myList.remove(10)
}
}
MutableList<Int> = arrayListOf()
も動作するはずです。
不変(読み取り専用)リストを持つ不変変数:
val users: List<User> = listOf( User("Tom", 32), User("John", 64) )
可変リストを持つ不変変数:
val users: MutableList<User> = mutableListOf( User("Tom", 32), User("John", 64) )
または初期値なし - 空のリストおよび明示的な変数型なし
val users = mutableListOf<User>()
//or
val users = ArrayList<User>()
users.add(anohterUser)
またはusers += anotherUser
(フードの下ではusers.add(anohterUser)
です)不変リストを持つ可変変数:
var users: List<User> = listOf( User("Tom", 32), User("John", 64) )
または初期値なし - 空のリストおよび明示的な変数型なし
var users = emptyList<User>()
users += anotherUser
- *新しいArrayListを作成し、それをusers
に割り当てます可変リストを持つ可変変数:
var users: MutableList<User> = mutableListOf( User("Tom", 32), User("John", 64) )
または初期値なし - 空のリストおよび明示的な変数型なし
var users = emptyList<User>().toMutableList()
//or
var users = ArrayList<User>()
users.add(anohterUser)
users += anotherUser
を使用しないエラー:Kotlin:代入演算子のあいまいさ:
パブリック演算子fun Collection.plus(element:String):kotlin.collectionsに定義されているリスト
@ InlineOnlyパブリックインライン演算子fun mutableCollection.plusAssign(element:String):kotlin.collectionsに定義されている単位
こちらもご覧ください。 https://kotlinlang.org/docs/reference/collections.html
MutableListを使用する上記のすべての回答に同意しますが、リストから追加/削除して、以下のように新しいリストを取得することもできます。
val newListWithElement = existingList + listOf(element)
val newListMinusElement = existingList - listOf(element)
または
val newListWithElement = existingList.plus(element)
val newListMinusElement = existingList.minus(element)
どうやら、デフォルトのKotlinのリストは不変です。変更可能なリストを作成するには、以下のようにMutableListを使用する必要があります。
class TempClass {
var myList: MutableList<Int>? = null
fun doSomething() {
myList = ArrayList<Int>()
myList!!.add(10)
myList!!.remove(10)
}
}
更新それでも、本当に変更したいリストがない限り、MutableListを使用することはお勧めできません。どのように読むために https://hackernoon.com/read-only-collection-in-kotlin-leads-to-better-coding-40cdfa4c6359 を参照します唯一のコレクションは、より良いコーディングを提供します。
https://kotlinlang.org/docs/reference/collections.html
上記のリンクによると、リスト<E>はKotlinでは不変です。しかしこれはうまくいくでしょう:
var list2 = ArrayList<String>()
list2.removeAt(1)
MutableList
またはArrayList
を使用する必要があります。
MutableList
のメソッドがどのように機能するのかを見てみましょう。
var listNumbers: MutableList<Int> = mutableListOf(10, 15, 20)
// Result: 10, 15, 20
listNumbers.add(1000)
// Result: 10, 15, 20, 1000
listNumbers.add(1, 250)
// Result: 10, 250, 15, 20, 1000
listNumbers.removeAt(0)
// Result: 250, 15, 20, 1000
listNumbers.remove(20)
// Result: 250, 15, 1000
for (i in listNumbers) {
println(i)
}
ArrayList
のメソッドがどのように機能するのかを見てみましょう。
var arrayNumbers: ArrayList<Int> = arrayListOf(1, 2, 3, 4, 5)
// Result: 1, 2, 3, 4, 5
arrayNumbers.add(20)
// Result: 1, 2, 3, 4, 5, 20
arrayNumbers.remove(1)
// Result: 2, 3, 4, 5, 20
arrayNumbers.clear()
// Result: Empty
for (j in arrayNumbers) {
println(j)
}
お役に立てれば。
list
はimmutable
によるDefault
です。代わりにArrayList
を使用することができます。このような :
val orders = arrayListOf<String>()
それからあなたは以下のようにこれからアイテムをadd/delete
できます:
orders.add("Item 1")
orders.add("Item 2")
デフォルトで
ArrayList
はmutable
なので、操作を実行できます。
不変データの概念では、おそらくこれがより良い方法です。
class TempClass {
val list: List<Int> by lazy {
listOf<Int>()
}
fun doSomething() {
list += 10
list -= 10
}
}
ここでの一番上の答えは、読み取り専用のList
(注: 読み取り専用であり、「不変」 ではない)とMutableList
の違いを正しく表しています。 。
一般に、読み取り専用リストの使用に努める必要がありますが、構築時、特に機能的でないインタフェースを持つサードパーティ製ライブラリを扱う場合には、可変性は依然として有用です。直接listOf
を使用する、またはfold
やreduce
のような関数構造を適用するなど、別の構築方法が利用できない場合は、一時的に変更可能なものから読み取り専用のリストを作成します。
val readonlyList = mutableListOf<...>().apply {
// manipulate your list here using whatever logic you need
// the `apply` function sets `this` to the `MutableList`
add(foo1)
addAll(foos)
// etc.
}.toList()
これは再利用可能なインラインユーティリティ関数にうまくカプセル化できます。
inline fun <T> buildList(block: MutableList<T>.() -> Unit) =
mutableListOf<T>().apply(block).toList()
これは次のように呼び出すことができます。
val readonlyList = buildList<String> {
add("foo")
add("bar")
}
これで、すべての可変性は読み取り専用リストの作成に使用される1つのブロックスコープに分離され、残りのコードはビルダーから出力される読み取り専用リストを使用します。
このような新しいものを作成することができます。
var list1 = ArrayList<Int>()
var list2 = list1.toMutableList()
list2.add(item)
これでlist2を使用できます。ありがとうございます。