跳到主要内容
版本:5.1.1

扩展

Doubao 中英对照 Extensions

Kotlin 扩展 提供了为现有类追加额外功能的能力。Spring Data 的 Kotlin API 使用这些扩展,为现有的 Spring API 增添 Kotlin 特有的便捷用法。

备注

请记住,Kotlin 扩展需要导入后才能使用。与静态导入类似,在大多数情况下 IDE 应会自动提示相应的导入。

例如,Kotlin 具体化类型参数为 JVM 的泛型类型擦除提供了一种变通方案,而 Spring Data 提供了一些扩展以利用这一特性。这使得 Kotlin API 更加完善。

在 Java 中检索 SWCharacter 对象列表时,您通常会这样写:

Flux<SWCharacter> characters = template.query(SWCharacter.class).inTable("star-wars").all()

而使用 Kotlin 并借助 Spring Data 扩展,您可以改写为:

val characters = template.query<SWCharacter>().inTable("star-wars").all()
// or (both are equivalent)
val characters : Flux<SWCharacter> = template.query().inTable("star-wars").all()

与 Java 中一样,Kotlin 中的 characters 也是强类型的,但 Kotlin 巧妙的类型推断允许更简洁的语法。

面向 Kotlin 的类型安全查询​

Kotlin 通过其语法和扩展体系支持创建领域特定语言。Spring Data MongoDB 附带了一个针对 Criteria 的 Kotlin 扩展,它使用 Kotlin 属性引用来构建类型安全的查询。使用该扩展编写的查询通常具有更好的可读性。Criteria 上的大多数关键词都有对应的 Kotlin 扩展,例如 inValues 和 regex。

以下示例说明了类型安全查询:

import org.springframework.data.mongodb.core.query.*

mongoOperations.find<Book>(
Query(Book::title isEqualTo "Moby-Dick") 1
)

mongoOperations.find<Book>(
Query(titlePredicate = Book::title exists true)
)

mongoOperations.find<Book>(
Query(
Criteria().andOperator(
Book::price gt 5,
Book::price lt 10
))
)

// Binary operators
mongoOperations.find<BinaryMessage>(
Query(BinaryMessage::payload bits { allClear(0b101) }) 2
)

// Nested Properties (i.e. refer to "book.author")
mongoOperations.find<Book>(
Query(Book::author / Author::name regex "^H") 3
)
  • isEqualTo() 是一个中缀扩展函数,其接收者类型为 KProperty<T>,返回 Criteria。

  • 对于按位运算符,传入一个 lambda 参数,并在其中调用 Criteria.BitwiseCriteriaOperators 的某个方法。

  • 要构造嵌套属性,请使用 / 字符(重载运算符 div)。

面向 Kotlin 的类型安全更新​

可以使用与面向 Kotlin 的类型安全查询类似的语法来更新文档:

mongoOperations.updateMulti<Book>(
Query(Book::title isEqualTo "Moby-Dick"),
update(Book:title, "The Whale") 1
.inc(Book::price, 100) 2
.addToSet(Book::authors, "Herman Melville") 3
)
  • update() 是一个工厂函数,其接收者类型为 KProperty<T>,返回 Update。

  • Update 中的大多数方法都有对应的 Kotlin 扩展。

  • 带 KProperty<T> 的函数也可用于集合类型。