自己的SDK架构 – Kotlin中的异步方法API

我们正在为我们的产品构建一个公共的SDK。 它是用Kotlin和内部我们使用协程。 但是,我们想要发布一个可用于JAVA的API,这就是为什么不能提供挂起的function作为公共API。 如果Java中的可用性不如Kotlin那么舒服,那么我们也可以。 所以,例如,我们正在寻找下面的异步方法的返回types: class Sdk { fun getPlace(): ___ } 我们考虑过的事情: 使用RX Java作为接口。 我们不喜欢这个解决方案,Rx非常复杂,我们希望尽可能少地添加其他的依赖关系。 一般来说,我们会去返回单。 但是,Rx java我们不想解决的问题(哪个线程应该是已完成的工作),而Rx并不解决我们想要解决的问题(如果可能的话),例如生命周期和观察者 – Android架构组件中解决的问题。 Java 8的未来。 这似乎是最合适的,但不可能,因为我们需要针对较旧的Android(至少4.1)。 Android架构LiveData。 返回一个LiveData似乎没问题,还有一个observeForever()方法,使它可以在后台线程中使用。 另一方面,api表明它可能会重复返回多个结果。 但是,我们只希望在结果或者一个例外上忽略。 但是,在Kotlin中,我们可以实现扩展函数,这将使得它可以像sdk.getPlace().await() 。 自定义解决方案:返回一个简单的Result对象,通过提供一个回调sdk.getPlace().observe(Observe { onSucccess(data: Place) {} onFailure(e: Throwable) {} }) 我们将提供一个等待的扩展function。 问题: 我们错过了一些重要的方面/图书馆/可能性吗? 我们应该选择哪种解决方案,为什么

如果在Kotlin中找不到可搜索的元素,我应该返回什么?

我有一个方法,它搜索数组中的某个元素。 在Java中它是“返回null”,但我不能在Kotlin中完成。 这是怎么回事? 我的方法: fun find(key: Int) : DataItem { var hashValue = hashFunc(key) while (true) { if (hashArray[hashValue].key == key) { return hashArray[hashValue] } else { } ++hashValue hashValue %= arraySize } }

如何覆盖gradle kotlin-dsl中的任务

在Groovy中,我覆盖了这样一个任务: task jar(overwrite: true) { … } 我如何用Kotlin-dsl来做到这一点? 我知道我可以创建一个这样的任务: tasks { val jar by creating { … } } 但是我无法find将其声明为覆盖的等效方法,这会导致错误

在Kotlin DSL中如何设置gradle额外属性?

我试图组织我的构建文件,因为我会在groovy,通过在一个单独的文件重用值。 但我不明白在kotlin DSL中做同样的事情的语法。 以下是我在root build.gradle.kts中使用的内容: applyFrom(“config.gradle.kts”) buildscript { repositories { google() jcenter() } dependencies { val test = project.extra[“minSdkVer”] classpath(“com.android.tools.build:gradle:3.0.0-alpha4”) classpath(“org.jetbrains.kotlin:kotlin-gradle-plugin:1.1.2-5”) // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { google() jcenter() mavenCentral() } } 这是什么在config.gradle.kts被引用: mapOf( Pair(“minSdkVer”, 22), Pair(“targetSdkVer”, […]

Spock与Mockito测试Kotlin课程

我有一些用Spock编写的测试,它涵盖了我的Java代码。 现在我迁移到Kotlin,问题是我不能嘲笑最终课,所以我决定使用这里描述的Mockito插件: https : //github.com/mockito/mockito/wiki/What%27s-new-in-Mockito-2# unmockable 问题是我需要用Mockitos的any(),anyString(),when(),then()等替换每个’_”>>’吗? 我试图用Mockito来模拟最终的类,但它似乎不工作。 如果我必须替换这种情况下使用Spock测试框架的好处吗? 也许我应该删除它,只留在Mockito?

使用Kotlin中的动态字段解析json对象

我有一个JSON对象: { “mobileNum”: “05x-xxxxxxx”, “appId”: “some_app”, “messageId”: “printUsersFirstTime”, “shouldSendDate”: “2017-10-03T16:20+03:00”, // this is optional “paramMap”: { “userName”: “some_name” }, “filters”: { “UNIQUE”: false, “RECENT”: “{ \”unit\”: \”MINUTE\”, \”size\”: 5 }” } 我使用Spring Boot和Kotlin。 Spring引导自动将提到的JSON映射到下面的模型bean: data class SmsDto( var mobileNum: String? = null, val appId: String? = null, val messageId: String? = null, var paramMap: Map? […]

我在java代码中实现了一个在kotlin中定义的接口。 有’空’types不允许在这里

我像这样在kotlin中定义了一个监听器接口 interface FooListener { fun onCall() } 我认为返回types实际上是kotlin单位 然后我在java中实现了这个接口 FooListener l = new FooListener() { @Override public void onCall() { } } 这里的onCall函数实现是由IDE自动生成的 我编译时说错了 Error:(107, 85) error: ‘void’ type not allowed here 任何人都可以帮我解决这个问题吗?

我们必须首先学习java来学习kotlin吗?或者我可以直接启动它?

正如我们所知,kotlin已被宣布为Android开发的官方语言,所以我必须先学习java来学习kotlin? 我有一个很好的Python经验,所以我不是一个面向对象编程的总诺贝尔

如何在Kotlin中复制MutableList?

所以,我刚开始和Kotlin一起,试图解决“骑士到棋盘上的目的地”的问题。 这是我的代码: fun knightSteps(i:Int,j:Int,a:Int,b:Int,board:Int,c :Int,d:Int,visited : MutableList<Pair>,steps:Int):Int{ // (i,j) start (a,b)knight moves (c,d) destination visited – visited positions board – size of board if(i==c && j==d) return steps if(isValid(Pair(i,j),board)){ val v = visited v.add(Pair(i,j)) var possible = mutableListOf() if(Pair(i+a,j+b) !in v ) { possible.add(knightSteps(i + a, j + b, a, b, board,c,d, v, 1 + […]

Kotlins扩展方法Stream.toList()丢失

我试图将一个流转换为kotlin中正确的types列表。 对于这种情况,kotlin提供了扩展方法Stream.toList() 。 这个方法位于kotlin.streams 。 IDE(IntelliJ)不允许在流上调用此方法。 我是否必须添加一个特殊的依赖项,或者它是否应该成为标准库的一部分? 我正在使用maven,并且存在对kotlin-stdlib-jdk8 1.2.10的依赖。 注意:流是从库函数返回的,所以我必须使用它。 请不要回答像“在kotlin你不使用流…”。