有相当多的博客文章(像这样)的标准库的用途功能apply/ with/ run/ also/ let可用,使它更容易一点distingish时实际使用的这那些漂亮的功能.
几个星期以来,官方文档甚至最终提供了关于该主题的指导:https://kotlinlang.org/docs/reference/coding-conventions.html#using-scope-functions-applywithrunalsolet
不过,我认为这是相当困难的记忆功能的个人使用的情况下,由函数名.我的意思是,对我来说,它们似乎是可以互换的,为什么不let被称为run例如?
有什么建议?我认为这些名字不是很有表现力,这使得一开始很难看出差异.
我是kotlin的新手,我想做一个没有"休息"的开关.在java中会是这样的:
switch (b){
case 3:
Log.d("int", "3");
case 2:
Log.d("int", "2");
case 1:
Log.d("int", "1");
}
Run Code Online (Sandbox Code Playgroud)
如果b = 2那么它将打印:
D/int:2
D/int:1
我想在Kotlin中做到这一点,而不是为每个案例重复相同的代码.在kotlin转换器中,代码输出是:
when (b) {
3 -> {
Log.d("int", "3")
Log.d("int", "2")
Log.d("int", "1")
}
2 -> {
Log.d("int", "2")
Log.d("int", "1")
}
1 -> Log.d("int", "1")
}
Run Code Online (Sandbox Code Playgroud)
还有另一种方法吗?我的实际代码比那个大;
和anko一样,你可以写这样的回调函数:
alert {
title = ""
message = ""
yesButton {
toast("Yes")
}
noButton {
toast("No")
}
}
Run Code Online (Sandbox Code Playgroud)
我该如何创建这样的嵌套函数?我尝试像下面那样创建它,但似乎没有工作.
class Test {
fun f1(function: () -> Unit) {}
fun f2(function: () -> Unit) {}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我用扩展功能,
fun Context.temp(function: Test.() -> Unit) {
function.onSuccess() // doesn't work
}
Run Code Online (Sandbox Code Playgroud)
从活动中调用此内容:
temp {
onSuccess {
toast("Hello")
}
}
Run Code Online (Sandbox Code Playgroud)
不行.我在这里仍然缺乏一些基本概念.谁能在这里指导?
如何ArrayList在Kotlin中分配空值?
我想尝试将null值添加到我的自定义ArrayList
中
var mList = ArrayList<CustomClass>()
mList.add(null)
Run Code Online (Sandbox Code Playgroud)
在java中它可能但我怎样才能在Kotlin中实现这一点?我正进入(状态
null不能是非null类型kotlin的值
我需要插入null值以在RecyclerView中加载更多功能
如果我们有一个val txt: kotlin.String = "1;2;3;"并且喜欢将它拆分成数组,我们可以尝试以下方法:
val numbers = string.split(";".toRegex())
//gives: [1, 2, 3, ]
Run Code Online (Sandbox Code Playgroud)
尾随空String包含在结果中CharSequence.split.
另一方面,如果我们看一下Java String,结果是不同的:
val numbers2 = (string as java.lang.String).split(";")
//gives: [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
这次使用时java.lang.String.split,结果不包括尾随空String.这个行为实际上是给定相应的JavaDoc:
此方法的工作方式就像调用带有给定表达式和limit参数为零的双参数split方法一样.因此,结尾的空字符串不包含在结果数组中.
在科特林的版本,虽然,0也就是默认limit的文件的说法在这里,但内部科特林地图,0负的值-1时,java.util.regex.Pattern::split被称为:
nativePattern.split(input, if (limit == 0) -1 else limit).asList()
Run Code Online (Sandbox Code Playgroud)
它似乎按预期工作但我想知道为什么该语言似乎限制Java API,因为0不再提供限制.
我正在学习Kotlin,具有C++和Java背景.我期待以下打印true,而不是false.我知道==那张地图equals.是否默认实现equals比不上每个成员,即firstName和lastName?如果是这样,它不会看到字符串值相等(因为再次==映射equal)?显然,有一些与平等和身份相关的东西,我还没有在Kotlin中找到.
class MyPerson(val firstName: String, val lastName: String)
fun main(args: Array<String>) {
println(MyPerson("Charlie", "Parker") == MyPerson("Charlie", "Parker"))
}
Run Code Online (Sandbox Code Playgroud) 我是Kotlin的新手和编程.我非常喜欢模式匹配的想法,正如您在下面的代码中看到的那样,我正在尝试使用when语句.
fun main(args: Array<String>) {
val myAr = arrayOf(1,2,3)
val myL = listOf(1,2,3)
fun probablyBlind() {
when(myL.size != myAr.size) {
myL.size > myAr.size -> {
println("myL.size > myAr.size = ${myL.size > myAr.size}")
}
myL.size < myAr.size -> myAr.forEach { println(it) }
}
if(myL.size != myAr.size) {
println("Inside if. myL.size > myAr.size =
${myL.size > myAr.size}")
}
}
probablyBlind()
}
Run Code Online (Sandbox Code Playgroud)
如果您运行代码,结果是:
myL.size > myAr.size = false
Run Code Online (Sandbox Code Playgroud)
这意味着在某些时候列表的大小与数组的大小不同.然后它在when语句中计算为true的第一个比较.但后来打印出来的是虚假的.这意味着它不应该运行这部分代码.if语句永远不会计算为true.
有人可以帮我这个吗?也许这是我目前无法看到的非常简单的事情.如果是这样的话,请原谅.
有时,创建已由现有第三方代码(即来自库)实现的接口很有用.例如,我们可以想象选择String类的方法的子集并声明a GenericString.然后我们可以定义GenericString实现这些方法的其他方法,但不能定义String该类的其他方法.唯一的问题是String该类不会从GenericString类继承.是否可以在Kotlin中为现有类添加接口,还是必须创建String实现此接口的子类?
是否可以声明一个只返回的函数null?不幸的是,你不能null在返回类型部分写.返回值应该是null而不是Unit,以便它可以与可空操作符一起使用.
我想在多个类中使用此函数:
fun <T> T?.ifNull(function: (T?, s:String) -> Unit) {
}
Run Code Online (Sandbox Code Playgroud)
我怎么能做到这一点?
这就是我想用它的方式:
class A{
fun <T> T?.ifNull(function: (T?, s:String) -> Unit) {
}
}
class B{
constructor(){
val a = A()
//I want to use the function here
}}
Run Code Online (Sandbox Code Playgroud)