擴充功能
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> 的函式也可以在集合類型上使用。 |