Scala Future 奇怪的编译错误
Scala Future strange compile error
下面的代码是真实代码的简化版本。我们 "inherited" 域模型 case object FutTest
和 case class FutTest
,我们无法修改。实际的领域模型是从数据库提供的,所以我相信 Future approach
是有效的,但它会导致我不明白的问题。
import org.scalatest.FunSpec
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
case object FutTest {
def create(sz: Int) = { FutTest(sz) }
}
case class FutTest(size: Int)
class FutureTest extends FunSpec {
def one(v: Int): Future[FutTest] = {
Future { FutTest.create(v) }
}
def two(t: FutTest) = {
Future { FutTest.create(t.size) }
}
def compileError1: Future[FutTest] = {
one(10).map(f => two(f))
}
def compileError2: Future[FutTest] = {
for { o <- one(10) } yield (two(o))
}
}
错误信息:
[INFO] Using incremental compilation
[INFO] Compiling 7 Scala sources and 5 .. target/test-classes...
[ERROR] domain.FutureTest.scala:25: type mismatch;
found : scala.concurrent.Future[domain.FutTest]
required: domain.FutTest
[ERROR] one(10).map(f => two(f))
[ERROR] ^
[ERROR] domain/FutureTest.scala:29: type mismatch;
found : scala.concurrent.Future[domain.FutTest]
required: domain.FutTest
[ERROR] for { o <- one(10) } yield (two(o))
我用 Int
而不是 FutTest
尝试了上面的代码,一切正常。为什么编译器会报错,我们如何在不触及现有域的情况下解决这个问题。
One()
returns a Future
and two()
also returns a Future
所以你需要 flatMap
而不是map
。当您映射到 two()
时,您的结果是 Future[Future[FutTest]]
并且需要展平。
正在做
one(10).flatMap(f => two(f))
应该可以解决问题。
flatMap就是你想要的。
one(10).flatMap(f => two(f))
或
one(10).flatMap(two)
用于理解,
for { o <- one(10); t <- two(o) } yield t
下面的代码是真实代码的简化版本。我们 "inherited" 域模型 case object FutTest
和 case class FutTest
,我们无法修改。实际的领域模型是从数据库提供的,所以我相信 Future approach
是有效的,但它会导致我不明白的问题。
import org.scalatest.FunSpec
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
case object FutTest {
def create(sz: Int) = { FutTest(sz) }
}
case class FutTest(size: Int)
class FutureTest extends FunSpec {
def one(v: Int): Future[FutTest] = {
Future { FutTest.create(v) }
}
def two(t: FutTest) = {
Future { FutTest.create(t.size) }
}
def compileError1: Future[FutTest] = {
one(10).map(f => two(f))
}
def compileError2: Future[FutTest] = {
for { o <- one(10) } yield (two(o))
}
}
错误信息:
[INFO] Using incremental compilation
[INFO] Compiling 7 Scala sources and 5 .. target/test-classes...
[ERROR] domain.FutureTest.scala:25: type mismatch;
found : scala.concurrent.Future[domain.FutTest]
required: domain.FutTest
[ERROR] one(10).map(f => two(f))
[ERROR] ^
[ERROR] domain/FutureTest.scala:29: type mismatch;
found : scala.concurrent.Future[domain.FutTest]
required: domain.FutTest
[ERROR] for { o <- one(10) } yield (two(o))
我用 Int
而不是 FutTest
尝试了上面的代码,一切正常。为什么编译器会报错,我们如何在不触及现有域的情况下解决这个问题。
One()
returns a Future
and two()
also returns a Future
所以你需要 flatMap
而不是map
。当您映射到 two()
时,您的结果是 Future[Future[FutTest]]
并且需要展平。
正在做
one(10).flatMap(f => two(f))
应该可以解决问题。
flatMap就是你想要的。
one(10).flatMap(f => two(f))
或
one(10).flatMap(two)
用于理解,
for { o <- one(10); t <- two(o) } yield t