我正在启动 Kotlin 并希望以构建器语法的模式配置Array
of Label
s。我想出了 Kotlin 标准库函数 ( apply
) 和集合上的辅助函数 ( forEach
)。将其称为构建器模式是否正确?这对我来说意味着声明、分配和配置在一行/一步中完成。我很欣赏任何关于如何以更紧凑和清晰的“Kotlin 式”方式编写它的想法,或者这或多或少是首选的 Kotlin 语法。顺便说一句,有很多方法可以解决这个问题(使用let
而不是apply
不返回接收器)。
val labels = arrayOf(Label("A"),Label("B"),Label("C"),Label("D")).apply {
this.forEach { it.prefWidth = 50.0 }
}
Run Code Online (Sandbox Code Playgroud) 我希望使用 Java 中经常使用的相当标准的 while 循环习惯用法来查找文本文件的最后一行。
我有一个不太紧凑的版本可以工作。但我想使用的语法在 Kotlin 中似乎不是有效的语法。我的首选方法包括在同一行中进行作业和Boolean
对该作业的测试。
诚然,这是一个小问题,但我希望更好地实现我的 Kotlin 代码。
fun readLastLine(file:File):String {
val bufferedReader = file.bufferedReader()
var lastLine=""
//valid
var current = bufferedReader.readLine()
while(current != null) {
lastLine=current
current = bufferedReader.readLine()
}
//return lastLine
//not valid...
//while((current=bufferedReader.readLine())!=null){
// lastLine=current
//}
//responding to comment below,
//preferred/terse answer using file.readLines
//this reads all the lines into a list, then returns the last
return file.readLines().last()
}
Run Code Online (Sandbox Code Playgroud) 我想定义的扩展名,该扩展名enum class
以与枚举常量相同的顺序接受值列表,并输出EnumMap
。
相反,我能够做的是使用作为输入List<V>
的键数组创建和扩展对象Enum<K>.values()
。
看来困难enum class
本身不是具有.values()
方法的对象。因此,也许我的要求不明智。
这是一个使用列表扩展方法的工作示例。
import java.util.*
enum class Shoes(
val title: String,
val weight: Double) {
WORKBOOT("tough", 11.0),
SNEAKER("fast", 6.0),
SLIPPER("soft", 3.0);
}
fun main(args: Array<String>) {
val prices= listOf(11.5,8.2,3.5)
val map = prices.enumMapOf(Shoes.values())
map.print()
}
inline fun <reified K : Enum<K>, V> List<V>.enumMapOf(keys:Array<K>): EnumMap<K, V> {
val map = EnumMap<K, V>(K::class.java)
keys.forEachIndexed{i,k-> map[k]=this[i]}
return map
}
fun <K:Enum<K>,V> EnumMap<K,V>.print() {
this.forEach{k,v-> println("%d: %s --> %.2f".format(k.ordinal,k.name,v)) …
Run Code Online (Sandbox Code Playgroud) 我可以成功地使用Gradle编译胖 JAR,但是在最近从“编译”依赖项规范切换到“实现/api”规范后运行 JAR 时遇到问题。我已经确定问题仅发生在以下两种情况之一。应用程序在 IntelliJ 中的任一情况下运行。
第一/问题:
dependencies {implementation 'no.tornado:tornadofx:1.7.18'}
Run Code Online (Sandbox Code Playgroud)
第二/作品:
dependencies {compile'no.tornado:tornadofx:1.7.18'}
Run Code Online (Sandbox Code Playgroud)
JAR 在这两种情况下都会编译。当我尝试在命令行上启动第一个案例 JAR 时出现问题,并引发以下错误。
C:\aaa_eric\code\testr\mic\build\libs>java -jar mic-1.0-snapshot.jar 错误:无法找到或加载主类 app.MyApp 引起:java.lang.NoClassDefFoundError:tornadofx/App
这是 build.gradle 中的 JAR 任务。tornadofx 依赖项是否可能在编译时可用,但在运行时不可用?谢谢你的帮助。
jar {
manifest {
attributes 'Main-Class': 'app.MyApp'
}
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}
Run Code Online (Sandbox Code Playgroud)