擴充套件

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 擴充套件,例如 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)
)
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> 的函式也可以用於集合型別
© . This site is unofficial and not affiliated with VMware.