我有2個數據結構itemDto和itemEntity,他們看起來像這樣。斯卡拉功能組合與未來
trait ItemDto{
def id: Long
def name: String
}
trait ItemEntity {
def id: Long
def name: String
}
case class Entity(id: Long, name: String) extends ItemEntity
case class Dto(id: Long, name: String) extends ItemDto
我想建立一個管道,看起來像這樣
ItemDto => ItemEntity => ItemEntity => Future[ItemEntity] => Future[ItemEntity] => Future[ItemDto]
我有一些映射功能,以及
object ItemMapper {
def mapDtoToEntity(dto: ItemDto): ItemEntity = {
Entity(dto.id, dto.name)
}
def mapEntityToDto(entity: ItemEntity): ItemDto = {
Dto(entity.id, entity.name)
}
}
一個遞增的實體ID的功能
object ItemEntity{
def incrementId(entity: ItemEntity) = Entity(entity.id + 1, entity.name)
}
and the the再是一個存儲庫來保存實體
object ItemRepository {
def save(entity: ItemEntity): Future[ItemEntity] = {
Future{entity}
}
}
最後我的方法,它結合了所有這些功能做一些看起來像這樣
import ItemMapper._
import ItemRepository.save
import ItemEntity.incrementId
def addItem(dto: ItemDto) = {
(mapDtoToEntity _ >>> incrementId >>> save >>> {_ map (incrementId _ >>> mapEntityToDto) })(dto)
}
保存方法被調用鏈中的後,我必須打破進入另一個功能。我的問題是,有沒有辦法將價值從未來中提升出來,然後放回原處,以便我的管道看起來像這樣?
(mapDtoToEntity _ >>> incrementId >>> save ?!? incrementId ?!? mapEntityToDto)(dto)
哪裏?!?
是假設運營商。
它也可能來自scala庫。它不需要來自scalaz。
感謝kleisli的真正好解釋。我之前對它有點熟悉,現在對它有了更好的把握。我真的很想知道是否有一位操作員自動執行此操作,但看起來並不像。順便說一句,雙增量是管道中多個操作的一個人爲的例子。我沒有在我的項目中這樣做。 – decapo