我有一個任務來轉換以下代碼塊:
val instance = instanceFactory.create
val result = instance.ackForResult
為理解式表達。
由于 for-comprehension 依賴于元素的列舉,我試圖用包裝類來解決它:
case class InstanceFactoryWrapper(value:InstanceFactory) {
def map(f: InstanceFactory => Instance): Instance
= value.create()
}
其中 map-method 必須只處理一個元素并回傳一個結果:Instance
我用這個運算式測驗了這種方法:
for {
mediationApi <- InstanceFactoryWrapper(instanceFactoryWrapper)
}
但它不起作用:IDEA建議我在這部分使用foreach。但是“foreach”不回傳任何東西,與地圖相反。
我究竟做錯了什么?
uj5u.com熱心網友回復:
簡單地說,在使用 List\Option\Either 或其他 lang 型別時,推導式可用于將嵌套 map\flatMap\withFilter 轉換為序列。
在理解中使用自定義類
但是您自己的課程或其他 3rd 方課程呢?
您需要實作 monadic 操作才能在 for-comprehensions 中使用它們。
最低限度: map 和 flatMap。
以下面的示例使用自定義 Config 類:
case class Config[T](content: T) {
def flatMap[S](f: T => Config[S]): Config[S] =
f(content)
def map[S](f: T => S): Config[S] =
this.copy(content = f(content))
}
for {
first <- Config("..")
_ = println("Going through a test")
second <- Config(first "..")
third <- Config(second "..")
} yield third
這就是您啟用理解的方式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/366274.html
