Tag: 拉姆达

为什么我不能在kotlin中使用lambda接口?

看,我有一个Java类: public final class JavaReceiveSingle { public static void useSingle(Single single) { single.doSth(); } public static void useSingle2(SingleInterface singleInterface) { singleInterface.doSth(); } } 一个Java界面: public interface SingleInterface { void doSth(); } 一个kotlin界面: interface Single { fun doSth() } 现在我可以在一个kotlin类中使用lambda: JavaReceiveSingle.useSingle2({}) 但是如果我想对kotlin接口做同样的事情: JavaReceiveSingle.useSingle({}) IDE将显示错误:必需:单个! 发现:() – >单位 如果我指定单一像: JavaReceiveSingle.useSingle(Single{}) 仍然错误:接口单一没有结构! 尽管下面的代码工作: JavaReceiveSingle.useSingle(object :Single{ override fun aa() […]

在lambda中使用return?

在下面的代码中,我想显示空的视图,如果旅行是空的,然后返回并避免运行下面的代码,但编译器说:“返回不允许在这里”。 mainRepo.fetchUpcomingTrips { trips -> if (trips.isEmpty()) { showEmptyViews() return } // run some code if it’s not empty } 有没有办法像那样回报? 我知道我可以把它放在一个if else块中,但是如果有其他情况,我讨厌写作,当我有更多的条件时,在我看来这是不太可理解的。

数据绑定:带有lambda值的ObservableField不能编译

我试图通过计算将一个参数作为参数的lambda来定义View的可见性。 顺便说一下 , 我正在使用Kotlin 。 在我的ViewModel我有: val customerPropVisibility: ObservableField<(KProperty1) -> Int> = ObservableField( { _ -> // body of the lambda }) 该View的绑定expression式如下所示: android:visibility=”@{vm.customerPropVisibility.invoke(title)}” vm和title被正确地声明为布局data标签中的variables。 在编译时,我得到两个错误: 1)不兼容的types:对象不能转换为Function1 2)不兼容的types:对象不能被转换为整数 第一种types只有一个错误,第二种types有几个错误。 第二种types的错误数量与布局xml文件中lambda的调用数量相同。 我试图解决这个问题: 显然,types1的错误可以通过重写ObservableField的get()方法来解决(使方法明确地返回Function1 )。 这是有效的,但是很难看,编译器在推断customerPropVisibility的types时应该这样做。 当然,这里有些不对劲。 types2的错误对我来说是一个谜,导致函数types(my lambda)显式地返回Int。 我认为这与Kotlin / Java的互操作性有关。 如果您遇到同样的问题,请分享解决问题的经验。 编辑: 由于这个bug还没有解决,我使用稍微不同的方法来达到相同的结果: 而不是将ObservableField的值设置为lambda,我将其设置为函数引用( ::getVisibility ),如下所示: fun getVisibility(prop: KProperty1): Int = propVisibilityValues[prop] ?: View.GONE val […]

我可以转换模板expression式中的字符串还是kotlin中的lambdaexpression式?

我可以转换模板expression式中的字符串还是kotlin中的lambdaexpression式? val tm = “x = $”+”x” val fn: (x: String) -> String = { it -> tm} val str = fn(“This is X!!!”) 需要得到 x =这是X! 为什么?:您可以接收模板,例如,从数据库PS:或您的建议

Kotlin:lambda从不编译

我刚刚开始学习Kotlin,在那里我遇到了lambda语法问题。 有一个小例子: class MathFunctions { @FunctionalInterface interface Operation { fun calculate(a: Int, b: Int): Int } fun makeCalculations(a: Int, b: Int, operation: Operation): Int = operation.calculate(a, b) companion object { @JvmStatic fun main(args: Array) { val plus = Operation { a, b -> a + b } val mathFunctions = MathFunctions() println(mathFunctions.makeCalculations(10, 20, plus)) } […]

用lambda参数链接方法是什么?

我正在研究Kotlin编码挑战,并提出了一个类似这样的解决方案: val x = listOf(1, 2, 3) .fold(“”) { acc, i -> acc + someLookupFunction(i) }.let { // something } 以上是我希望如何格式化。 但是,使用IntelliJ自动格式化程序时,它坚持认为代码应该如下格式化: val x = listOf(1, 2, 3) .fold(“”) { acc, i -> acc + someLookupFunction(i) }.let { // something } 我的第一个想法是,这是一个错误,但实际上我认为这只是模糊的。 格式器必须认为let是lambda本身的函数调用,而不是fold的结果。 为了证实这一点,我改变了这个: val x = listOf(1, 2, 3) .fold(“”, { acc, i -> […]

kotlin的htmlx构建器如何正确地工作?

这是解释htmlx构建器某些部分的片段(来自文档): protected fun initTag(tag: T, init: T.() -> Unit): T { tag.init() children.add(tag) return tag } 最重要的是children.add(tag) ,所以我们可以声明: html { head {} body {} } 因为head和body是html的成员函数。 但是DIV标签呢? 我可以在任何地方宣布div,而且我可以这样写: someEnclosingTag { (1..3).forEach { div {+”MyCustomDivFromEverywhere”} }} 如何包装lambda知道“孩子”lambda(并分别添加到整个html的“孩子”标签),可以在任何地方宣布? 请纠正我,如果我在某个地方错了。 UPDATE 基于回答,我结束了以下肮脏的虚拟代码,显示函数范围(封闭的一些方面)和隐式的接收器遗漏(希望它可以以某种方式帮助某人): fun main(args: Array) { Child().childFun { /*childFun lambda receiver implements parent1Fun lambda receiver, so the receiver […]

Lambda与Receiver的目的是什么?

Lambda在Kotlin的接收器的目的是什么?我们有扩展function吗? 下面的两个函数做同样的事情,但是第一个函数更具可读性和简短性: fun main(args: Array) { println(“123”.represents(123)) println(123.represents(“123”)) } fun String.represents(another: Int) = toIntOrNull() == another val represents: Int.(String) -> Boolean = {this == it.toIntOrNull()}

空或空lambda作为默认值

哪个解决方案比较好? 使用可空lambda或传递空lambda作为默认参数? kotlin会不会优化空lambda? 或者创建一个什么都不做的新实例? class Test1(val action: () -> Unit = {}) 不幸的是我不明白生成的字节码。 让我们分析一下 val test11 = Test1() 反编译后给我们 private static final Test1 test11 = new Test1((Function0)null, 1, (DefaultConstructorMarker)null); 最后作为一个lambda传递这样的东西 var1 = (Function0)null.INSTANCE; 编辑:隐藏的问题是:Kotlin如何将空lambda作为默认值?

Kotlin扩展lambdas与常规lambda

根据以下源代码,似乎正常的lambda可以与扩展lambdas互换。 fun main(args: Array) { val numbers = listOf(1, 2, 3) filter(numbers, predicate) filter(numbers, otherPredicate) println(“PREDICATE: ${predicate} ” + “\nOTHERPREDICATE: ${otherPredicate} ” + “\nEQUALITY: ${predicate==otherPredicate}”) } val predicate : Int.() -> Boolean = {this % 2 != 0} val otherPredicate : (Int) -> Boolean = {it % 2 != 0} fun filter(list: List, predicate:(Int) -> […]