可以使用Kotlin中的比较运算符重载来实现类似SQL的功能吗?

时间:2017-05-25 21:53:17

标签: operator-overloading kotlin

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)

但这并不是那么清晰

1 个答案:

答案 0 :(得分:1)

Kotlin确实有这些功能,但不是你想到的形式。 Kotlin是一种通用编程语言,它是OOP和FP的混合,而不是域特定语言。 Kotlin倾向于通过函数解决问题,而不是运算符/语言结构。例如,kotlin使用filter函数来实现SQL where子句的功能。

然而,其中一些功能实际上是模仿内置语言结构。

fooCollection.filter {it.bar > 0}

在上面的代码fooCollection中是Collection<Foo>Foo是从表foo的记录映射的POJO / java bean。)

如果您对上面发布的任何内容不清楚,请通过以下评论告诉我。