如果测试所在的模块与生产代码不同(这是常见的),那么使内部函数对测试可见的最佳方法是什么?
在Java中,我将生产代码和测试放在同一个包中,并使待测试的方法包私有(另外,@VisibleForTest
如果将包装私有而非私有的唯一原因是添加注释)测试).不幸的是,Kotlin没有包私有的概念.
我有一个对象流,我想找到一个具有某个属性的最大值的那个,计算起来很昂贵.
作为一个特定的简单示例,假设我们有一个字符串列表,我们希望找到最酷的一个,给定一个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)
但是,我无法在Stream
API中找到匹配的方法.这让我感到惊讶,因为通过属性查找min/max似乎是一种常见的模式.我想知道是否有比使用比较器更好的方法(除了for循环).
如果我们静态编译Groovy,Kotlin和Groovy看起来非常相似,并且具有非常相似的功能.哪些功能,除了null安全性,Kotlin在Groovy中缺少哪些功能?
我正在尝试编写一个比较两个可比数据列表的函数.可比较的数据可以是各种类型,只要被比较的两个列表中相同位置的元素是可比较的.例:
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因为
因此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) 我有一个混合了 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 编译我的项目,但无法让命令行脚本工作。
这是我尝试过的:
将 jar 添加到 CLASSPATH。不起作用。Kotlin 编译器看不到它。它可能会忽略 CLASSPATH。
添加 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) 我有一个简单的无向图G = (V, E)
。给定一个节点n
,有没有一种简单的方法来找到它的所有邻居,即所有节点m
,使得{n, m} in E
?
有edgesOf
一种方法,它返回连接到给定节点的所有边。但是,似乎在无向图中它多少有些随意,哪个节点是源,哪个节点是目标。
我想我可以简单地检查我的节点是源节点还是目标节点,然后另一个节点是我要寻找的邻居,但这很麻烦。有没有更优雅的方式?
kotlin ×4
java ×2
collections ×1
command-line ×1
compilation ×1
generics ×1
graph ×1
groovy ×1
java-stream ×1
jgrapht ×1
unit-testing ×1