我在项目中使用Kotlin脚本作为Gradle模块的配置。 我有一个自定义部署插件,在运行时为每个服务器实例配置。 我使用扩展从脚本传递参数插件,因为它是写在gradle文档 。 build.gradle.kts : apply { plugin(DeployPlugin::class.java) } extensions.add(“settingsExtension”, {s: Server -> getSettings(s)}) fun getSettings(cfg: Server) = DeploySettings( //configure it with respect to cfg ) DeployPlugin.kt : val settingsExtension = project.extensions.getByName(“settingsExtension”) as ((Server) -> DeploySettings) val settings = settingsExtension.invoke(currentServer) 我不喜欢这种配置方式是我在每个模块配置添加扩展是样板代码。 除非我执行任务,否则我不知道它是否正确。 有没有其他方法可以将getSettings函数传递给插件代码? 谢谢。
任何人都知道我怎样才能“把/放”在kotlin内的地图? var bookDetailsMap: MutableMap<Long, MutableMap> = mutableMapOf() 我怎样才能把以下的书籍细节放在上面的地图上? var books: MutableList = this.bookDao.findAll() 预计存储将像> var bookDetailsMap: MutableMap<book.publisherId, MutableMap>
在java中,我们使用findviewbyid来定义id。 我想知道如何在kotlin中定义id而不使用任何第三方库。
我已经达到了这一个拉出舞台的头发! 我在Kotlin数据类中声明了一个懒惰的variables。 它是一个布尔值,根据类中的其他字段计算它的值。 Lazy.kt实现工作的方式是创建一个名为UNINITIALIZED_VALUE的匿名对象,以此作为确定是否已经初始化lazy var的基础。 每个lazy var实例都有自己唯一的UNINITIALIZED_VALUE实例。 该对象存储在Lazy对象的_value字段中。 当访问lazy var的值时,通过执行参考比较来检查当前值是否与UNINITIALIZED_VALUE相匹配。 如果不是,则初始化程序被调用以创建存储在lazy var _value字段中的值。 看起来在我的情况下发生的是UNINITALIZED_VALUE对象正在创建,并在懒惰var创建期间分配给值 – 到目前为止非常好。 然而,当我试图检索值,莫名其妙地, UNITIALIZED_VALUE对象已被设置为一个不同的对象的值,最初存储在_value字段,所以比较失败,懒惰的实现认为已设置的值,所以试图将UNINITIALIZED_VALUE对象转换为Boolean和繁荣! 例外! 真奇怪的是,我是团队中唯一遇到这个问题的人 – 我已经删除并重新安装了所有东西 – Android Studio,完整的git克隆,gradle缓存,模拟器。 我想不出任何其他的东西,并且无法看到UNINITIALIZED_VALUE对象被调试器设置了两次。
我已经子类DataInputStream并添加little-endian方法。 注意到我添加了一个新的表示原始InputStream inp属性。 我需要在新的方法中引用这个属性。 下面的代码工作正常: import java.io.* import org.apache.poi.util.* class MyDataInputStream(val inp: InputStream) : DataInputStream(inp) { fun readShortLittle(): Short { val r: Short try { r = LittleEndian.readShort(inp) } catch (e: LittleEndian.BufferUnderrunException) { throw EOFException() } return r } fun readIntLittle(): Int { val r: Int try { r = LittleEndian.readInt(inp) } catch (e: LittleEndian.BufferUnderrunException) […]
我的目标是什么? 我的目标是能够使用Java的Kotlin的Coroutine系统。 我希望能够暂停执行一段时间,然后在给定的时间过去之后在那个位置重新找回。 从Java,我希望能够执行任务,而不是以异步方式暂停执行中间执行,例如: //example 1 someLogic(); pause(3000L); //3 seconds someMoreLogic(); //example 2 while(true) { someContinuedLogic(); pause(10000L); //10 seconds } 我的问题是什么? 正如所料,我能够从Kotlin中完美地执行协程,但是对于Java来说,它变得棘手,因为代码的Java部分立即执行整个块而没有任何暂停,而Kotlin块正确地暂停1,并且然后4秒。 我的问题是什么? 甚至有可能使用Kotlin作为Java协程的主干? 如果是这样,我做错了什么? 下面你可以find显示我如何尝试在Java中使用Kotlin协程的源代码。 KtScript类 abstract class KtScript { abstract fun execute() fun async(block: suspend () -> T): CompletableFuture { val future = CompletableFuture() block.startCoroutine(completion = object : Continuation { override fun resume(value: […]
我有一个Kotlin数据类,我正在构建许多不可变的属性,这些属性是从单独的SQL查询中获取的。 如果我想使用构建器模式构造数据类,那么如何在不使这些属性可变的情况下做到这一点? 例如,而不是通过构建 var data = MyData(val1, val2, val3) 我想用 builder.someVal(val1) // compute val2 builder.someOtherVal(val2) // … var data = builder.build() 同时仍然使用Kotlin的数据类特性和不可变属性。
我有一个通过测试下面,使用内联的乐趣。 class SimpleClassTest { private inline fun anyObject(): T { return Mockito.anyObject() } lateinit var simpleObject: SimpleClass @Mock lateinit var injectedObject: InjectedClass @Before fun setUp() { MockitoAnnotations.initMocks(this) } @Test fun testSimpleFunction() { simpleObject = SimpleClass(injectedObject) simpleObject.simpleFunction() verify(injectedObject).settingDependentObject(anyObject()) } } 但现在我想删除内联的乐趣,因为它只有一个用法。 所以我用实际的类名称替换T,即Response(来自Okhttp),并将其直接设置为参数settingDependentObject class SimpleClassTest { lateinit var simpleObject: SimpleClass @Mock lateinit var injectedObject: InjectedClass @Before fun […]
我刚刚进入kotlin,我试图用Android studio 3.0 Canary 2,JRE 1.8.0创建一个基本的计算器。 不幸的是,当我将应用程序安装到手机中时,结果与下图不同 在我的android工作室,设计是这样的 这是我的xml 虽然有第二个问题, 我试图输入数字字段,当我点击+(添加)按钮,它立即崩溃。 这是错误 FATAL EXCEPTION: main Process: com.example.jeffrey.kotlincalculator, PID: 20432 java.lang.NumberFormatException: Invalid int: “” at java.lang.Integer.invalidInt(Integer.java:138) at java.lang.Integer.parseInt(Integer.java:358) at java.lang.Integer.parseInt(Integer.java:334) at com.example.jeffrey.kotlincalculator.MainActivity.getNum1(MainActivity.kt:42) at com.example.jeffrey.kotlincalculator.MainActivity$onCreate$1.onClick(MainActivity.kt:24) at android.view.View.performClick(View.java:5207) at android.view.View$PerformClick.run(View.java:21177) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5438) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629) 这显然表明INT是一个错误。 这是我的MainActivity代码。 package […]
我想知道为什么Kotlin中的大多数variables都加下划线。 一些文件包含很多下划线,这是非常烦人的。 如果我将鼠标hover在variables上,那么大部分时间都不会提供任何信息。 但是在一些说“这个财产有一个后盾领域”或“在封闭中捕获的价值”。 有人知道如何禁用这些下划线? 下面是我的意思是一个截图: 然后在整个文件中将领域加下划线。