Scala期货基础

Scala期货基础,scala,asynchronous,concurrency,promise,future,Scala,Asynchronous,Concurrency,Promise,Future,我在Scala中有以下代码: case class Water(temp: Int) case class Milk(temp: Int) def heatWaterFor(minutes: Int, water: Water) = Future { Thread.sleep(1000) Water(82) } def boilMilkFor(minutes: Int, milk: Milk) = Future { Thread.sleep(1000) Milk(90) }

我在Scala中有以下代码:

case class Water(temp: Int)

case class Milk(temp: Int)

def heatWaterFor(minutes: Int, water: Water) = Future {
  Thread.sleep(1000)
  Water(82)
}

def boilMilkFor(minutes: Int, milk: Milk) = Future {
  Thread.sleep(1000)
  Milk(90)
}

def frothMilk(hotwater: Water, hotmilk: Milk) = Future {
  Thread.sleep(1000)
  hotmilk
}

val start = System.currentTimeMillis()

val milkMaker = for {
   water <- heatWaterFor(10, Water(10))
   milk <- boilMilkFor(5, Milk(10))
   frothed = frothMilk(water, milk)
   hotMilk <- frothed
 } yield (hotMilk)

Await.ready(milkMaker, Duration.Inf)
val end = System.currentTimeMillis() - start
println(milkMaker.value + " , Time taken: "+((end/1000))+" seconds.")
case类水(温度:Int)
案例级牛奶(温度:Int)
def加热水(分钟:整数,水:水)=未来{
线程。睡眠(1000)
水(82)
}
def boilMilkFor(分钟:整数,牛奶:牛奶)=未来{
线程。睡眠(1000)
牛奶(90)
}
def泡沫牛奶(热水:水,热水牛奶:牛奶)=未来{
线程。睡眠(1000)
热牛奶
}
val start=System.currentTimeMillis()
val挤奶工=用于{

water我猜您是这样做的:。最后,它提到了为什么这段代码是连续的,以及如何将其并行化(最后一段代码)。

请检查

简而言之,当你像这样使用
时,你的每个变量(
牛奶
起泡
)都会在上一次评估准备就绪时开始评估。这允许在以后的评估中使用上一次评估的结果,但会使计算顺序化


另外(不相关的)您创建未来的方法(
heatWaterFor
等)不使用参数。

A for expression被简化为一系列
map
flatMap
with filter
操作。您特定的for expression被简化为如下:

heatWaterFor(10, Water(10))
        .flatMap(water => boilMilkFor(5, Milk(10))
                             .flatMap(milk => frothMilk(water, milk))
val heatWater = heatWaterFor(10, Water(10))
val boilMilk = boilMilkFor(5, Milk(10))

val milkMaker = for {
   water <- heatWater
   milk <- boilMilk
   hotMilk <- frothMilk(water, milk)
} yield (hotMilk)
正如您在这里看到的,下一个future的执行是在上一个future完成时开始的。因此,如果您希望并行执行它们,您需要执行以下操作:

heatWaterFor(10, Water(10))
        .flatMap(water => boilMilkFor(5, Milk(10))
                             .flatMap(milk => frothMilk(water, milk))
val heatWater = heatWaterFor(10, Water(10))
val boilMilk = boilMilkFor(5, Milk(10))

val milkMaker = for {
   water <- heatWater
   milk <- boilMilk
   hotMilk <- frothMilk(water, milk)
} yield (hotMilk)
val heatWater=热水器(10,水(10))
val boilMilk=boilMilkFor(5,牛奶(10))
val挤奶工=用于{

water你介意在这里发布相关代码吗?在SO中,只链接的答案是不受欢迎的。考虑到这一点,但是marstran已经在他的答案中发布了代码,所以我不会再发布了。