擴充套件
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 一樣,characters
在 Kotlin 中是強型別的,但 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)
)
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> 的函式也可以用於集合型別 |