如何将泛型List设置为Neo4j存储过程中的属性



我正在制作一个带有一些存储过程的Neo4j插件。其中一个需要采用任意类型的参数,并将它们保存为Node上的属性。天真的我可能会这样做

val props: Map<String, Any> = <procedure input>
props.forEach(node::setProperty)

这适用于标量类型,但如果值是List,则会失败

java.lang.IllegalArgumentException:[[123]:java.util.ArrayList]不是受支持的属性值

因为setProperty希望该值为数组。由于(我认为(类型的擦除,简单地将List强制转换为Array会导致Array<Any>

我有一个略显笨拙的解决方案:

props.forEach { (key, value) ->
if (value is Collection<*>) {
val firstElement = value.firstOrNull()
if (firstElement != null) {
val arrayValue: Array<Any?> =
java.lang.reflect.Array.newInstance(firstElement.javaClass, value.size) as Array<Any?>
value.forEachIndexed { index, element -> arrayValue[index] = element }
node.setProperty(key, arrayValue)
} else {
node.setProperty(key, emptyArray<Long>()) // Arrays need a type, so we just pick one
}
} else {
node.setProperty(key, value)
}
}

这是有效的,但有没有更简单的方法来做我想做的事?

Kotlin已经内置了函数toTypedArray((。它将在不丢失类型的情况下将任何集合转换为数组。希望这正是你所需要的。
var value = arrayListOf<String>("Foo","Bar")
var arrayValue : Array<String> = value.toTypedArray() 

这是Kotlin标准图书馆的一部分。你可以在这里找到最新版本。

最新更新