从Java 1.6 Collection Framework文档:
不支持任何修改操作(例如
add,remove和clear)的集合称为不可修改.[...]另外保证Collection对象中的任何更改都不可见的集合称为不可变.
第二个标准让我感到困惑.鉴于第一个集合是不可修改的,并假设原始集合引用已被丢弃,第二行中引用的更改是什么?它是指集合中保存的元素的变化,即元素的状态?
第二个问题:
对于一个不可变的集合,如何提供额外的guarentees指定?如果一个线程更新了集合中元素的状态,那么在不可变集合的线程中,状态中的那些更新是不可见的,这对于不变性是否足够?
对于一个不可变的集合,如何提供额外的guarentees指定?
Kotlin有很多简短和有趣的功能.所以,我想知道是否有一些快速和简短的方法将字符串数组转换为整数数组.与Python中的此代码类似:
results = [int(i) for i in results]
Run Code Online (Sandbox Code Playgroud) 函数toArray应该将类型擦除列表转换T为Array<String>现在的列表.
inline fun <reified T> toArray(list: List<*>): T {
return list.toTypedArray() as T
}
toArray<Array<String>>(listOf("a", "b", "c")) // should be arrayOf("a", "b", "c")
Run Code Online (Sandbox Code Playgroud)
但是,toArray抛出此错误.
java.lang.ClassCastException:[Ljava.lang.Object; 无法转换为[Ljava.lang.String;
你有什么想法?
鉴于从Kotlin Koans中提取的以下代码:
fun Shop.findAnyCustomerFrom(city: City): Customer? {
// Return a customer who lives in the given city, or null if there is none
return customers.firstOrNull { it.isFrom(city) }
}
Run Code Online (Sandbox Code Playgroud)
我用自己的解决方案customers.find.两者都在koan场景中工作.
文档firstOrNull和find似乎非常相似.
这两个功能有什么区别?
我正在尝试学习在 Android 中做事的“Kotlin 原生方式”,同时既不是 Kotlin、Java 也不是 Android 开发的专家。具体来说,何时使用ArrayListvsMutableList。
在我看来,MutableList应该尽可能选择。然而,如果我查看 Android 示例,他们似乎总是选择ArrayList(就我目前发现的而言)。
下面是一个工作示例的片段,它使用ArrayList并扩展了 Java 的RecyclerView.Adapter.
class PersonListAdapter(private val list: ArrayList<Person>,
private val context: Context) : RecyclerView.Adapter<PersonListAdapter.ViewHolder>() {
Run Code Online (Sandbox Code Playgroud)
即使我是从 Android 的 Java 代码中借用的,我是否可以简单地将上述代码编写如下(注意MutableList<>而不是ArrayList<>)?
class PersonListAdapter(private val list: MutableList<Person>,
private val context: Context) : RecyclerView.Adapter<PersonListAdapter.ViewHolder>() {
Run Code Online (Sandbox Code Playgroud)
总是使用MutableListover真的更好ArrayList吗?主要原因是什么?我上面提供的一些链接让我无法理解,但在我看来,这MutableList是一个更松散的实现,在未来更有能力改变和改进。那正确吗?
我只是在kotlin的初级水平.我没有任何办法在kotlin中为数组添加值.我想从用户获取值并将它们添加到数组中.
val arr = arrayOf<Int>()
Run Code Online (Sandbox Code Playgroud)
要么
var arr = intArrayOf()
Run Code Online (Sandbox Code Playgroud)
像在Java中一样
Scanner ob=new Scanner(System.in);
int arr[]=new int[5];
for(int i=0;i<arr.length;i++)
{
arr[i]=ob.nextInt();
}
Run Code Online (Sandbox Code Playgroud)
如何在kotlin中执行相同的操作?
我正在建模一些 JSON - 并使用以下几行
data class Metadata(
val id: String,
val creators: Array<CreatorsModel>
)
Run Code Online (Sandbox Code Playgroud)
随着:
data class CreatorsModel (
val role: String,
val name: String
)
Run Code Online (Sandbox Code Playgroud)
但是一直看到错误:Array property in data class error。
任何想法这是为什么?
仅供参考,JSON 如下所示:
{
"id": "123",
"creators": [{
"role": "Author",
"name": "Marie"
}
]
}
Run Code Online (Sandbox Code Playgroud) 我已经开始使用Kotlin作为java的替代品并且非常喜欢它.但是,如果没有跳回到java-land,我一直无法找到解决方案:
我有一个Iterable<SomeObject>并且需要将其转换为列表,因此我可以多次迭代它.这是一个不可变列表的明显应用,因为我需要做的就是多次读取它.我如何在开始时将这些数据实际放入列表中?(我知道这是一个界面,但我一直无法在文档中找到它的实现)
可能的(如果不满意)解决方案:
val valueList = arrayListOf(values)
// iterate through valuelist
Run Code Online (Sandbox Code Playgroud)
要么
fun copyIterableToList(values: Iterable<SomeObject>) : List<SomeObject> {
var outList = ArrayList<SomeObject>()
for (value in values) {
outList.add(value)
}
return outList
}
Run Code Online (Sandbox Code Playgroud)
除非我误解,否则这些最终MutableLists会有效,但感觉就像是一种解决方法.是否有类似的immutableListOf(Iterable<SomeObject>)方法将实例化一个不可变的列表对象?
我试图拆分用户输入的字符串.我的代码看起来类似于以下内容:
val aList = Array(5, {Array<String>(2){ " " }})
aList[0] = ArrayList(input.nextLine().split(" ")) // `split` returns a List
Run Code Online (Sandbox Code Playgroud)
但这会导致以下错误:
error: type inference failed. Expected type mismatch: inferred type is ArrayList<String!> but Array<String> was expected.
经过一番挖掘后,我发现T!操作员意味着T or T?.我怎样才能投ArrayList<String!>来Array<String>?
刚开始使用 Kotlin,我喜欢它,但是……我无法理解这种语言中的 Lists 和 Arrys。我对编程并不陌生,不需要解释什么是数组。我不明白的是。
列表和数组有什么区别?它们看起来非常相似,您都使用 [index] 访问它们并以几乎相同的方式使用它们。如果列表是不可变的,那么它们就更加相同,所以......有什么区别?假设列表不是链表,它们的访问时间都是 O(1)。
如果我使用列表;可变和不可变有什么区别?什么时候可以编辑内容?什么时候可以改变长度?
同一事物似乎有许多重叠且令人困惑的名称。List、ListOf、ArrayList、IntArray、intArray...
有人可以列出所有这些列表,并在您使用每一个时给出某种经验法则。具体来说,我发现不可变空列表的概念非常令人困惑。那到底是用来做什么的?
你如何初始化这些东西?
抱歉问了这么长的问题,
谢谢。
最近我遇到了一个问题,我有一个函数必须返回一个Is数组,以 enum 的所有值的形式E,E实现 interface I,我想到的每个代码编译器都抱怨类型不匹配:
Error:(x, x) Kotlin: Type mismatch: inferred type is Array<E> but Array<I> was expected
Run Code Online (Sandbox Code Playgroud)
一个最小的例子:
interface I {}
enum class E: I {
A, B, C;
}
fun getMoreInterfaces(): Array<I> {
return E.values()
}
Run Code Online (Sandbox Code Playgroud)
当尝试分配E.values()给类型的变量时会发生这种情况,Array<I>
我很确定这应该是可能的,因为E实现了I.
我在测试时想到的另一件事是,像这样使用时它工作得很好:
interface I {}
enum class E: I {
A, B, C;
}
fun getMoreInterfaces(): Array<I> {
return arrayOf(E.A, E.B, E.C)
}
Run Code Online (Sandbox Code Playgroud)
我在这个主题上做了很多搜索,但没有运气(也许我选择了错误的描述方式?)
kotlin ×10
arrays ×3
collections ×2
immutability ×2
android ×1
arraylist ×1
enums ×1
java ×1
json ×1
list ×1
mutablelist ×1