小编Jan*_*lek的帖子

Kotlin:为单元测试提供内部功能

如果测试所在的模块与生产代码不同(这是常见的),那么使内部函数对测试可见的最佳方法是什么?

在Java中,我将生产代码和测试放在同一个包中,并使待测试的方法包私有(另外,@VisibleForTest如果将包装私有而非私有的唯一原因是添加注释)测试).不幸的是,Kotlin没有包私有的概念.

unit-testing package-private kotlin

21
推荐指数
2
解决办法
9962
查看次数

Java Stream:查找具有属性的最小/最大值的元素

我有一个对象流,我想找到一个具有某个属性的最大值的那个,计算起来很昂贵.

作为一个特定的简单示例,假设我们有一个字符串列表,我们希望找到最酷的一个,给定一个coolnessIndex函数.

以下应该有效:

String coolestString = stringList
        .stream()
        .max((s1, s2) -> Integer.compare(coolnessIndex(s1), coolnessIndex(s2)))
        .orElse(null);
Run Code Online (Sandbox Code Playgroud)

现在,这有两个问题.首先,假设coolnessIndex计算成本很高,这可能不会非常有效.我想这个max方法需要重复使用比较器,这反过来会coolnessIndex重复调用,最后每个字符串会多次调用它.

其次,必须提供比较器会导致代码中的一些冗余.我更喜欢这样的语法:

String coolestString = stringList
        .stream()
        .maxByAttribute(s -> coolnessIndex(s))
        .orElse(null);
Run Code Online (Sandbox Code Playgroud)

但是,我无法在StreamAPI中找到匹配的方法.这让我感到惊讶,因为通过属性查找min/max似乎是一种常见的模式.我想知道是否有比使用比较器更好的方法(除了for循环).

java collections java-stream

19
推荐指数
3
解决办法
3万
查看次数

哪些Kotlin功能在静态编译的Groovy中不可用?

如果我们静态编译Groovy,Kotlin和Groovy看起来非常相似,并且具有非常相似的功能.哪些功能,除了null安全性,Kotlin在Groovy中缺少哪些功能?

groovy kotlin

17
推荐指数
2
解决办法
7427
查看次数

比较Kotlin中可比较的列表

我正在尝试编写一个比较两个可比数据列表的函数.可比较的数据可以是各种类型,只要被比较的两个列表中相同位置的元素是可比较的.例:

    val list1 = ArrayList<Comparable<*>>()
    val list2 = ArrayList<Comparable<*>>()

    list1.add(10)
    list1.add("xyz")
    list1.add('a')

    list2.add(10)
    list2.add("xyz")
    list2.add('b')

    println(compare(list1, list2))
Run Code Online (Sandbox Code Playgroud)

这应该打印-1因为

  • 10 == 10
  • "xyz"=="xyz"
  • 'a'<'b'

因此list1 <list2.

这是我将一些试验和错误过程放在一起的代码,因为我对这个特定情况下泛型如何工作有点困惑:

fun <T> compare(list1: List<Comparable<T>>, list2: List<Comparable<T>>): Int {
    for (i in 0..Math.max(list1.size, list2.size) - 1) {
        val elem1 = if (i < list1.size) list1[i] else null
        val elem2 = if (i < list2.size) list2[i] else null

        if (elem1 == null && elem2 == null)
            return 0

        if (elem1 == null)
            return -1

        if (elem2 …
Run Code Online (Sandbox Code Playgroud)

generics kotlin

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

从命令行使用 jar 依赖项编译 Kotlin

我有一个混合了 Java 和 Kotlin 文件的项目。直到最近,我才使用如下简单脚本从命令行成功编译它:

export CLASSPATH=java/main

# compile Kotlin files
find java/main/ -type d \
| xargs kotlinc-jvm -cp java/lib/google-collections-0.9.jar -d java/main/

# compile Java files
find java/main/ -name '*.java' | xargs javac
Run Code Online (Sandbox Code Playgroud)

然后我开始使用 JGraphT 库,这样就创建了对 jgrapht jar 的依赖关系。该库是从 Kotlin 文件中引用的。我仍然可以从 IntelliJ 编译我的项目,但无法让命令行脚本工作。

这是我尝试过的:

  1. 将 jar 添加到 CLASSPATH。不起作用。Kotlin 编译器看不到它。它可能会忽略 CLASSPATH。

  2. 添加 jar 作为另一个-cp参数:

    find java/main/ -type d \ | xargs kotlinc-jvm \ -cp java/lib/google-collections-0.9.jar \ java/lib/jgrapht-core-0.9.1.jar \ -d java/main/

然后我收到以下错误:

error: source entry is not a Kotlin …
Run Code Online (Sandbox Code Playgroud)

command-line compilation kotlin

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

JGraphT:获取邻居节点

我有一个简单的无向图G = (V, E)。给定一个节点n,有没有一种简单的方法来找到它的所有邻居,即所有节点m,使得{n, m} in E

edgesOf一种方法,它返回连接到给定节点的所有边。但是,似乎在无向图中它多少有些随意,哪个节点是源,哪个节点是目标。

我想我可以简单地检查我的节点是源节点还是目标节点,然后另一个节点是我要寻找的邻居,但这很麻烦。有没有更优雅的方式?

java graph jgrapht

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