可以使用Kotlin中的比较运算符重载来实现类似于SQL的功能吗?
Kotlin有限的运算符超载。 我正在包装一个基于矢量的操作的API,因为它们是用R,Julia,APL等语言完成的。最常见的例子是在SQL中,你可以说:
select * from foo where bar > 3;
使得每个记录都被单独评估,并且如果通过比较则被添加到结果集。 在Kotlin中,比较运算符重载与compareTo方法相关联:
Expression Translated to a > b a.compareTo(b) > 0 a < b a.compareTo(b) < 0 a >= b a.compareTo(b) >= 0 a <= b a.compareTo(b) <= 0 All comparisons are translated into calls to compareTo, that is required to return Int.
所以在我看来,没有办法使用操作符重载来表示一个向量为导向的比较操作。 我错过了什么吗?
解决方法是使用infix关键字创建函数,如:
infix fun greaterThan(x: Int)...
可以这样调用:
where(bar greaterThan 3)
但是这不是很清楚
Kotlin确实有这些功能,但不是你想象中的形式。 Kotlin是一种通用的编程语言,它是OOP和FP的混合,而不是域特定的语言。 Kotlin倾向于通过功能来解决事物,而不是操作者/语言构造。 例如,kotlin使用filter
函数来实现SQL where
子句所做的事情。
然而其中一些功能实际上是在模仿内建的语言结构。
fooCollection.filter {it.bar > 0}
在上面的代码中, fooCollection
是一个Collection<Foo>
(而Foo
是从你的表foo
记录映射的POJO / java bean)。
如果您不清楚我上面发布的任何内容,请通过下面的评论告诉我。