Tag: lambda

使用函数引用重写Kotlin中的Java代码会发生SAM类型冲突

我有一个示例Java代码使用方法引用,我想重写到Kotlin。 Java版本使用方法参考,解决方案简短明了。 但另一方面,我不能在Kotlin中使用方法引用。 我设法编写的唯一版本是下面介绍的一个。 看起来像Function3 { s: String, b: Boolean, i: Int -> combine(s, b, i) }可以用更简洁的方式编写(如果可能的话,方法引用将是完美的)。 我是Kotlin新手,所以我会感激任何线索。 Java的 import io.reactivex.Observable; public class TestJava { Observable<String> strings() { return Observable.just("test"); } Observable<Boolean> booleans() { return Observable.just(true); } Observable<Integer> integers() { return Observable.just(1); } void test() { Observable.combineLatest(strings(), booleans(), integers(), this::combine); } double combine(String s, boolean […]

如何在Kotlin中编写正确的HTML生成器

我正在学习Kotlin并阅读“ 类型安全建设者 ”部分 我跟着它的例子,编写了一些测试,然后我发现了一个我无法理解的问题。 问题是,看起来下面的代码是等价的: 嵌套的head html { head { title { +"First Title" } head { title { +"Second Title" } } } } 两个head在同一水平 html { head { title { +"Second Title" } } head { title { +"First Title" } } } 这两个函数调用返回相同的结果。 测试结果 我认为正确的结果应该是“你看到的就是你得到的”。

如何将参数传递给Kotlin中的匿名lambda函数?

我想在Kotlin中编写一个匿名的lambda函数,但看起来并不需要传递给它的参数。 (它根本不会被传递,因为IDE提示“ 变量名”从不使用 “)。 码: var name = "Tobias Boon" println("reverse=" + fun(name: String): String { var t: String = "" for(i in name.indices.last downTo 1) { t += text.subSequence(i – 1, i) } return t }) 目前打印: reverse=(kotlin.String) -> kotlin.String

将lambda存储在kotlin的变量中

我正在用kotlin开始在Android上开发,并且在lambdas中遇到问题。 我有一个函数来设置一个监听器在我看来,这看起来像这样: fun setListener(listener: () -> Unit) { } 问题是,作为lambda函数传递的代码将不会在setListener函数中执行,它将在我的代码的另一部分执行(特别是当一个微调项目被选中),所以我必须“保存”或“存储”这个lambda变成一个变量/属性,以便我能够在需要时执行它。 任何想法如何做到这一点? 编辑:我已经做到了: private var listener: (() -> Unit)? = null fun setListener(listener: () -> Unit) { this.listener = listener } 有没有更好的方法来做到这一点? 谢谢

java.lang.NoClassDefFoundError $$ intern $ forEach $ lambda $ 1在Kotlin中

我目前正在使用Kotlin 1.1.1版本开发Android应用程序 在我的代码中,我为了读取几个MutableList和MutableMap而MutableMap了几个forEach结构。 不幸的是,我的应用程序崩溃与以下stacktrace: java.lang.NoClassDefFoundError:com.package.fragment.ReminderAddFragment $ onRetrieveBusinessObjects $$内联$ forEach $ lambda $ 1 com.package.fragment.ReminderAddFragment.onRetrieveBusinessObjects(ReminderAddFragment.kt:275)在com.smartnsoft.droid4me.app.Droid4mizer .onRetrieveBusinessObjects(Droid4mizer.java:552)at com.smartnsoft.droid4me.app.Droid4mizer.onRetrieveBusinessObjectsInternal(Droid4mizer.java:606)at com.smartnsoft.droid4me.app.Droid4mizer.access $ 000(Droid4mizer.java:46)at com .smartnsoft.droid4me.app.Droid4mizer $ 1.run(Droid4mizer.java:197)at java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:423)at java.util.concurrent.FutureTask.run(FutureTask。 java:237)在java.util。线程。的.java:818) 这里的代码 tutorialCategories.forEach { (_, _, _, _, _, tutorials) -> tutorials.forEach { tutorial -> if (tutorial.id == simpleReminderFromExtra.tutorialId) { //… val mapOfreminders = mutableMapOf<Int, MutableList<Reminder>>() val reminders […]

在Kotlin中使用功能类型的功能接口

从Kotlin调用Java代码时,有SAM转换,以便Java代码如下所示: adapter.setOnClickListener(new OnClickListener() { @Override public void onClick(View view, int position) { // Do stuff here } }); 可以看起来像这样: adapter.setOnClickListener { view, position -> // Do stuff } 现在,我正在做一个Kotlin项目,我想将一个函数接口定义为一个事件监听器: interface OnSomeActionListener { fun onSomeAction(parameter1: Int, parameter2: String) } 在SomeClass我有一个函数来设置监听器: … private var onSomeActionListener: OnSomeActionListener? = null fun setOnSomeActionListener(listener: OnSomeActionListener) { onSomeActionListener = listener } … […]

如何在Kotlin中创建一个匿名接口的实例?

我有一个第三方的Java库,它的接口是这样的: public interface Handler<C> { void call(C context) throws Exception; } 我如何在Kotlin中简洁地实现它类似于这样的Java匿名类: Handler<MyContext> handler = new Handler<MyContext> { @Override public void call(MyContext context) throws Exception { System.out.println("Hello world"); } } handler.call(myContext) // Prints "Hello world"

Kotlin:何时以及如何使用Lambda表达式

我最近一直在为我的Android项目转向Kotlin,并对Lambdas有所了解。 当我们将Java文件转换为Kotlin文件时,我们看到许多lambda表达式。 何时以及如何准确地使用lambda函数? 另外,高阶函数和lambda函数/表达式有什么区别? 在Android上下文中的具体答案将是有帮助的。

Kotlin:泛型函数作为返回类型?

在Kotlin中,是否可以声明一个泛型函数类型作为函数的返回类型? 我想要在Java中看起来像这样: interface Factory { static Factory INSTANCE = new FactoryImpl(); <T> T create(String name, Class<T> type); } class PrefixedFactory implements Factory { private final String prefix; PrefixedFactory(String prefix) { this.prefix = prefix; } @Override public <T> T create(String name, Class<T> type) { return Factory.INSTANCE.create(prefix + name, type); } } (请注意,在本例中,我使用静态字段访问Factory实例,以避免将泛型函数作为参数传递,这会在Kotlin中显示自己的问题)。 我想将前缀转换为kotlin函数,但似乎不可能将泛型函数声明为返回类型: fun prefixer(prefix: String): […]

Lambda在Kotlin中使用通配符

我正在看谷歌提供的例子,并遇到这条线 private final ArrayMap<Class, Callable<? extends ViewModel>> creators; 我有困难搞清楚如何转换Callable<? extends ViewModel> Callable<? extends ViewModel>为Kotlin中的lambda 我怎么去做这个? 编辑: class ViewModelFactory(appComponent: AppComponent) : ViewModelProvider.Factory { private val creators: ArrayMap<Class<*>, () -> ViewModel> = ArrayMap() init { creators.put(DashboardViewModel::class.java, { appComponent.getDashboardViewModel() }) } override fun <T : ViewModel?> create(modelClass: Class<T>?): T = creators[modelClass]?.invoke() as T } 在上面的代码中,我在我的IDE中得到了一个未经检查的转换lint消息。 有没有办法避免这种情况?