擴充功能

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 隨附 Kotlin 擴充功能,用於 Criteria,使用 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)
)
1 isEqualTo() 是具有接收器類型 KProperty<T> 的中綴擴充功能,會傳回 Criteria
2 對於位元運算子,請傳遞 lambda 引數,您可以在其中呼叫 Criteria.BitwiseCriteriaOperators 的其中一個方法。
3 若要建構巢狀屬性,請使用 / 字元(多載運算子 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)
)
1 update() 是具有接收器類型 KProperty<T> 的工廠函式,會傳回 Update
2 Update 中的大多數方法都有對應的 Kotlin 擴充功能。
3 具有 KProperty<T> 的函式也可以在集合類型上使用。