小编Mic*_*ter的帖子

Kotlin fun() 与 lambda 有区别吗?

这个问题是关于 fun() 与 lambda 块定义和范围的问题。
我尝试用两种方式定义表达式。这是我尝试过的:

  val myFunction = fun(){
    println("i am in a function")
    }

//but i also tried doing this:

    val myFunction = {
    println("i am in a lambda")
    }
Run Code Online (Sandbox Code Playgroud)

我的问题是我不知道它们是否等效且相同?

lambda anonymous-function kotlin

2
推荐指数
1
解决办法
2446
查看次数

多个类型的等于重载导致运算符“==”无法应用于

这里等于重载

class MyClass {
    ...
    val string: String = ...

    override operator fun equals(other: Any?): Boolean {
        if (other != null) else { return false }
        if (other is MyClass && string == other.string) { return true }
        if (other is String && string == other) { return true }
        return false
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

这个想法是能够比较:

myClass1 = MyClass("ABCDEF")
myClass2 = MyClass("ABC123")

myClass1 == fsPath2  >> false
or
myClass1 == "ABC123" >> false
Run Code Online (Sandbox Code Playgroud)

但预编译显示:运算符 '==' 不能应用于 'MyClass' 和 'String'

任何想法?

equals operator-overloading kotlin

2
推荐指数
1
解决办法
283
查看次数

如果第一个参数为true,则必须在函数中传递第二个参数

我有自定义的Kotlin函数:

fun getActiveCartTest(isAsync: Boolean = false, vararg callback: Callback<Cart> ): TransportResponse? {
...
}
Run Code Online (Sandbox Code Playgroud)

它具有一个默认参数(isAsync)和一个可选vararg)回调参数。我可以像这样从Java调用此函数:

1.  TransportResponse transportResponse = TransportService.INSTANCE.getActiveCartTest();
2.  TransportResponse transportResponse = TransportService.INSTANCE.getActiveCartTest(false);
3.  TransportResponse transportResponse = TransportService.INSTANCE.getActiveCartTest(true);
4.  TransportService.INSTANCE.getActiveCartTest(true, new DefaultRestClientCallback<Cart>() {
            @Override
            public void onTransportResponse(@NotNull TransportResponse transportResponse) {

            }
        });
Run Code Online (Sandbox Code Playgroud)

很好,可以。但是,当我使用此调用时:

TransportResponse transportResponse = TransportService.INSTANCE.getActiveCartTest(true);
Run Code Online (Sandbox Code Playgroud)

我收到一个编译错误。

我的意思是。当客户端想要调用函数的异步调用时,getActiveCartTest必须使用两个参数:isAsync AND callback

如您在我的函数中所见,getActiveCartTest客户端可以省略第二个参数(callback)。不对

我需要第一个param isAsync = true,那么用户还必须 …

arguments variadic-functions kotlin

1
推荐指数
1
解决办法
50
查看次数

Kotlin中的stackoverflowerror

我是kotlin的新手,我的代码有问题:我不知道为什么当我创建类的实例时却给了我stackoverflow错误

这是代码:

class Spice(val spiceName: String,val spiciness: String = "mild") {

    init {
        println("[$spiceName - $spiciness] ")
    }

    val spiceList: List<Spice> = listOf(
            Spice("curry", "mild"),
            Spice("pepper", "medium"),
            Spice("cayenne", "spicy"),
            Spice("ginger", "mild"),
            Spice("red curry", "medium"),
            Spice("green curry", "mild"),
            Spice("hot pepper", "extremely spicy"))

    val heat: Int
        get() {
            return when (spiciness) {
                "mild" -> 1
                "medium" -> 3
                "spicy" -> 5
                "very spicy" -> 7
                "extremely spicy" -> 10
                else -> 0
            }
        }


    fun makeSalt() = Spice("Salt")

}
Run Code Online (Sandbox Code Playgroud)

stack-overflow kotlin

1
推荐指数
1
解决办法
68
查看次数

Kotlin乘法时给出错误的结果

我想乘281.65100和得到28165,我执行:

fun main(args: Array<String>) {
    println("${281.65 * 100}")
}
Run Code Online (Sandbox Code Playgroud)

但我得到28164.999999999996 这里的问题是什么,如何得到28165结果?有没有好的Kotlin处理方式?

floating-point kotlin

1
推荐指数
1
解决办法
69
查看次数

如何在Kotlin中将列表爆炸到Map中?

假设您要转换此代码:

val initialValues: List<Pair<String, String>>
Run Code Online (Sandbox Code Playgroud)

其中第一个String代表键,第二个String代表值

进入地图:

val finalMap: Map<String,String>
Run Code Online (Sandbox Code Playgroud)

每个对项包含两次,第一个具有原始密钥,第二个具有某种扩展密钥。

你会怎么做?目前,我正在使用

val finalMap = mutableMapOf<String, String>()
Run Code Online (Sandbox Code Playgroud)

我在遍历时使用的代码initialValues。但是我真的不喜欢。

initialValues.forEach {
    val explodedPairs:List<Pair<String,String>>  = <do-something> 

    explodedPairs.forEach { finalMap.put(it.first, it.second) }
}
Run Code Online (Sandbox Code Playgroud)

您将如何更果断地做?

functional-programming kotlin

1
推荐指数
1
解决办法
102
查看次数

有人可以解释这个Kotlin表达吗?

我正在使用Kotlin学习android开发。作为主要的Web开发人员,我对这两种技术都是陌生的。

在寻找API-29连接解决方​​案(NetworkInfogetActiveNetworkInfo中已弃用API-29)时,我遍历了该表达式以进行变量声明。

 protected var callbackFunction: ((Boolean) -> Unit) = {}

 abstract fun startListening(callback: (Boolean) -> Unit)
Run Code Online (Sandbox Code Playgroud)

我将如何解释?我说的是,变量callbackFunction是Boolean类型还是Unit类型。或者是其他东西。在该抽象函数中,回调类型是Boolean还是Unit或其他?

我也对花括号有点困惑。这是否意味着变量是由空的匿名函数(类似于JavaScript)初始化的,还是完全不同的概念?

lambda kotlin

1
推荐指数
1
解决办法
88
查看次数

我可以在不运行Kotlin的情况下收集可变的功能吗?

在Python中,我可以创建功能关键字的字典并调用其关键字,而无需运行字典中的其他功能。有相当于Kotlin的东西吗?

我创建了一个mutableMapOf(1到a(),2到b()),该函数可以部分工作,但是即使未调用其键,这两个函数也会每次运行。在Python中,我可以说:

def a(): print("Hi")
def b(): print("Bye")

function_dictionary = {1: a, 2: b} 
function_dictionary[1]() //runs a()
Run Code Online (Sandbox Code Playgroud)

在科特林,我只能想到:

fun a(){println("Hi")}
fun b(){println("Bye")}

val functionMap = mutableMapOf<Int, Unit>(1 to a(), 2 to b()) //a() and b() both run 
functionMap[1] //runs a() again
Run Code Online (Sandbox Code Playgroud)

在Kotlin示例中,无论是否选择了分配给它们的地图键,这些功能都会运行。我可以制作与字典中的字典相同的地图吗?

collections lambda kotlin

0
推荐指数
1
解决办法
49
查看次数

Kotlin安全成对迭代

我刚开始使用Kotlin,为了进行练习,我想成对读取程序参数。

程序的输入如下Alice 10 Bob 20 ...

我有一个当前版本,可以通过分块输入并成对迭代来合理地工作

for((name, age)  in args.asIterable().chunked(2)) 
Run Code Online (Sandbox Code Playgroud)

但是,如果我传递的参量数量不一,则最后一个分块列表仅包含一个元素,并且赋值失败并带有IndexOutOfBoundsException。

我可以通过在分块列表上添加一个过滤器来完成这项工作,如果它的大小不正确,该过滤器将丢弃最后一个列表:

 for((name, age)  in args.asIterable().chunked(2).filter { it -> it.size==2 })
Run Code Online (Sandbox Code Playgroud)

但是,我对此有一些问题

  • 我有两次指定的列表长度
  • 有了过滤器,它看起来不那么可读和优雅
  • 筛选器必须遍历整个列表,但只有最后一个子列表才是相关的

是使分块仅返回完整块的好方法,还是仅读取完整子列表的安全且优雅的方法?

functional-programming kotlin

0
推荐指数
1
解决办法
46
查看次数