小编J.E*_*zyk的帖子

Kotlin 中集合的构建器语法

我正在启动 Kotlin 并希望以构建器语法的模式配置Arrayof Labels。我想出了 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)

collections builder kotlin

5
推荐指数
1
解决办法
230
查看次数

在 Kotlin 的 while 循环中包括赋值和对赋值的测试

我希望使用 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)

idioms kotlin

1
推荐指数
1
解决办法
623
查看次数

从Kotlin中的值列表创建EnumMap

我想定义的扩展名,该扩展名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)

enum-map kotlin kotlin-extension

1
推荐指数
2
解决办法
2061
查看次数

Gradle 实现与 jar 任务中的编译

我可以成功地使用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)

jar executable-jar build.gradle

1
推荐指数
1
解决办法
1812
查看次数