Tag: lambda

在lambda kotlin变通方法中的智能转换变量

我今天已经过了一个lambda,它有一个未知类型的变量,并且在when..is条件中,变量不能智能地转换成is条件中的类型…这使得它是不可能的,因为变量是一个公共的API,有没有解决这个?

Kotlin – List列表中的列表过滤

我有这些数据类: data class RouteType( @SerializedName("type") val type: String, @SerializedName("items") val items: List<RouteItem>) data class RouteItem( @SerializedName("id") val id: String, @SerializedName("route") private val route: List<DoubleArray>) 我想按类型过滤RouteType的列表,并在其中通过id过滤RouteItem的列表。 我的代码现在: // val filter: HashMap<String, List<String>> val result = routeTypes // List<RouteType> .filter { it.type in filter.keys } .map { routeType -> routeType.items.filter { it.id in filter[routeType.type]!! } } 如何使.map返回列表中的过滤列表? […]

用Kotlin和lambda返回接口实现

我有这个简单的界面: interface ValidationBehavior { fun onValidated() } 这个接口用于一个类的一个功能: private enum class BehaviorEnum { IDLE, NAVIGATEBACK } private fun getBehavior(payloadBehavior: String) : ValidationBehavior { when(BehaviorEnum.valueOf(payloadBehavior)) { BehaviorEnum.IDLE -> return object: ValidationBehavior { override fun onValidated() { // do some stuff } } } } 我的问题是:是否有一种方法来简化与lambda返回语句? 我尝试一些这样的东西,但它不工作: return ValidationBehavior{ () -> //do some stuff }

Kotlin:我怎样才能调用一个lambda字段,它有一个泛型类?

我怎样才能调用一个lambda字段有一个泛型类的类? 出于某种原因,像Example<*>这样的泛型类的引用会产生一个用Nothing代替原始类型(如Example<Something> )的接受。 我怎样才能调用这样一个lambda通过仅参考Example<*> ? Codebase我遇到这个问题: https : //github.com/Jire/Acelta/tree/master/src/main/kotlin/com/acelta/packet/incoming/packets 我正在尝试这个代码,但正如你可以看到在第五行我不能调用lambda,因为接受类型是Nothing 。 private val incoming = arrayOfNulls<Packet<*>>(256) fun incoming(id: Int, packeteer: Packeteer) { val packet = incoming[id] ?: return packet.receive(packeteer, /* this is type Nothing! */) }

Kotlin使用迭代索引过滤lambda数组

我想过滤一个数组到每个第n个项目的数组。 例如: fun getNth(array: Array<Any>, n: Int): Array<Any> { val newList = ArrayList<Any>() for (i in 0..array.size) { if (i % n == 0) { newList.add(array[i]) } } return newList.toArray() } 有没有一种惯用的方法来做到这一点,例如使用Kotlin的.filter()和没有A)供应一个新的ArrayList和B)手动迭代for / in循环?

将传递lambda到Observable.subscribe in kotlin导致内存泄漏?

请参阅以下kotlin代码: class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { val disposable = Observable.interval(1, TimeUnit.SECONDS, AndroidSchedulers.mainThread()) .subscribe { textView.text = it.toString } } } 在这里,我正在传递一个lambda表达式,而不是一个匿名的内部类。 那么是否需要调用disposable.dispose()以防止内存泄漏? 或者,lambda表达式不会保留对MainActivity类的实例的隐式引用。 如果我确实需要处理它,那么最好的方法是什么?为什么?

在Kotlin中设置Android监听器 – 在lambdas中使用return

考虑这个监听器代码: expandable_list.setOnChildClickListener { expandableListView, view, groupPosition, childPosition, l -> Toast.makeText( applicationContext, listDataHeader[groupPosition] + " : " + listDataChild[listDataHeader[groupPosition]]!![childPosition], Toast.LENGTH_SHORT).show() return false} 这将无法正常工作,而我正在得到“返回不允许在这里”错误形式的IDE。 我已经查了一下,结果显示返回在lambda表达式中不起作用,但我试图使用的方法的签名是: public final fun setOnChildClickListener(onChildClickListener:((ExpandableListView!, View!, Int, Int, Long) -> Boolean)! : Unit 我的解决方法是定义我的侦听器逻辑在一个单独的函数,返回布尔如下所示: private fun myBooleanReturningFun(): Boolean { Toast.makeText( applicationContext, "I work from here", Toast.LENGTH_SHORT).show() return false } 然后在我的监听器中调用它: expandable_list.setOnChildClickListener { expandableListView, […]

Kotlin,Proguard和lambda

我有一个整洁的功能,在视图上做一些事情: fun<T : View> Activity.withView(nr : Int, fn : T.()->Unit) { (findViewById(nr) as T?)?.fn() } 现在,当我在我的活动中使用这个函数: withView<Spinner>(R.id.spinner_toolbar) { adapter = AdapterIndeksuDlaSpinnera(this@NewMainActivity, PlaylistIndex) …一切正常,直到我使用ProGuard。 我可以看到AdapterIndeksuDlaSpinnera如预期的AdapterIndeksuDlaSpinnera受到了损坏,但是当程序用“无法加载类AdapterIndeksuDlaSpinnera”(同时它应该抱怨损坏的适配器名称)进行编程时,程序失败。 我能够通过禁用所有可以在我的withView使用的适配器来创建速度解决方法 -keep class pl.qus.xenoamp.adapter.** { *; } 但我不觉得这是一个好的解决方案(我不知道其他类可以以这种方式失败!)。 所以任何人都可以解释什么是问题,我应该添加什么样的ProGuard行来解决在withView使用的其他类的类似withView ?

在Kotlin lambda表达式中重写多个接口方法

说我有两个方法onCurrentLocation和onError的Callbacks接口: public interface Callbacks { void onCurrentLocation(ClientLocation location); void onError(); } 和一个在它的构造函数中接受这个接口的类,说: public MyLocationClient(Callbacks callbacks) {…} 现在,在Kotlin中,我应该如何能够实例化MyLocationClient: val myLocationClient = MyLocationClient( { location: ClientLocation -> updateClientLocation(location) }, {}) 如果没有,为什么不呢? 我看到的行为是:当接口只有一个方法,这个对象的构造罚款。 但是,只要我添加更多的方法Callbacks ,编译器抱怨 “Type mismatch。Required:Callbacks!Found:(ClientLocation) – > Unit” 编辑:删除空位检查的location因为它是不相关的问题。

Java项目中Kotlin的高阶函数

我有一个函数类型作为形式参数: fun doSomething(code: () -> Boolean) = false //package function in TestKt.class 我试着在Java中调用它,传入一个lambda: //Java class, in Java project class Demo { public static void main(String[] args) { TestKt.doSomething(() -> false); } } 但是我得到的错误: 无法推断功能接口类型 它适用于Java类在Kotlin项目中,但不在Java项目中。 在我的Java项目中使用来自Kotlin的类时,我没有遇到任何其他问题,例如使用kotlin.Boolean类型的kotlin方法和使用vararg参数参数。 题 我如何正确调用Java项目的doSomething函数?