跳到主要内容

扩展功能

DeepSeek V3 中英对照 Extensions

Kotlin 扩展 提供了为现有类添加额外功能的能力。Spring Data Kotlin API 利用这些扩展为现有的 Spring API 添加了新的 Kotlin 特有的便利功能。

备注

请记住,Kotlin 扩展需要导入才能使用。类似于静态导入,在大多数情况下,IDE 应该会自动建议导入。

例如,Kotlin 的具体化类型参数 为 JVM 的 泛型类型擦除 提供了一种解决方案,Spring Data 提供了一些扩展来利用这一特性。这使得 Kotlin 的 API 更加优秀。

要检索 SWCharacter 对象的列表,在 Java 中通常会编写以下代码:

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

使用 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()
kotlin

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

Kotlin 的类型安全查询

Kotlin 通过其语言语法和扩展系统支持领域特定语言的创建。Spring Data MongoDB 附带了一个针对 Criteria 的 Kotlin 扩展,该扩展使用 Kotlin 属性引用 来构建类型安全的查询。使用此扩展的查询通常受益于更高的可读性。Criteria 上的大多数关键字都有相应的 Kotlin 扩展,例如 inValuesregex

考虑以下解释类型安全查询的示例:

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
)
kotlin
  • 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
)
kotlin
  • update() 是一个带有接收者类型 KProperty<T> 的工厂函数,它返回 Update

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

  • 带有 KProperty<T> 的函数也可以在集合类型上使用。