Scala 过滤器对布尔内部的未来进行理解
Scala filter on future of boolean inside for comprehension
我正在尝试验证项目序列的未来。我的验证方法也是 returns 布尔值的未来。我能够让它工作,但我不确定我自己明白这里发生了什么。
因此,我有一个有效的代码和一个无效的代码。任何人都知道这里发生了什么?
另外,如何通过在地图之后链接过滤器使其工作,以便它全部在一个地方并且以后不必使用分配?
def main(args: Array[String]): Unit = {
println(Await.result(testMethod(), Duration.Inf))
}
def validationMethod(n: Int) = {
Future { n % 2 == 0 }
}
有效代码:
def testMethod() = {
for {
seqOfIntegers <- Future { List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) }
numberToBooleanTupleSeq <- Future.sequence(seqOfIntegers.map {
number =>
validationMethod(number)
.map(validtedBooleanTuple => (number, validtedBooleanTuple))
})
finalIntegerSeq = numberToBooleanTupleSeq.filter(_._2).map(_._1)
} yield {
finalIntegerSeq
}
无效代码:
def testMethod() = {
for {
seqOfIntegers <- Future { List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) }
finalIntegerSeq <- Future.sequence(seqOfIntegers.map {
number =>
validationMethod(number)
.map(validtedBooleanTuple => (number, validtedBooleanTuple))
.filter(_._2)
.map(_._1)
})
} yield {
finalIntegerSeq
}
}
关注类型。
在您的第二个代码段中,您通过 Future 调用 filter
,但它没有像您预期的那样工作。因为,它不会从期货集合中删除该元素,而是 returns a failed Future with a NoSuchElementException
,然后使所有代码都因此类异常而失败。
顺便说一句,这是您的工作代码的完善版本,它更加高效和可读。
import scala.concurrent.Future
def validationMethod(n: Int): Future[Boolean] =
Future((n % 2) == 0)
def testMethod() =
for {
seqOfIntegers <- Future {
List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
}
validated <- Future.traverse(seqOfIntegers) { number =>
validationMethod(number).map { boolean =>
number -> boolean
}
}
result = validated.collect {
case (n, true) => n
}
} yield result
我正在尝试验证项目序列的未来。我的验证方法也是 returns 布尔值的未来。我能够让它工作,但我不确定我自己明白这里发生了什么。
因此,我有一个有效的代码和一个无效的代码。任何人都知道这里发生了什么? 另外,如何通过在地图之后链接过滤器使其工作,以便它全部在一个地方并且以后不必使用分配?
def main(args: Array[String]): Unit = {
println(Await.result(testMethod(), Duration.Inf))
}
def validationMethod(n: Int) = {
Future { n % 2 == 0 }
}
有效代码:
def testMethod() = {
for {
seqOfIntegers <- Future { List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) }
numberToBooleanTupleSeq <- Future.sequence(seqOfIntegers.map {
number =>
validationMethod(number)
.map(validtedBooleanTuple => (number, validtedBooleanTuple))
})
finalIntegerSeq = numberToBooleanTupleSeq.filter(_._2).map(_._1)
} yield {
finalIntegerSeq
}
无效代码:
def testMethod() = {
for {
seqOfIntegers <- Future { List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) }
finalIntegerSeq <- Future.sequence(seqOfIntegers.map {
number =>
validationMethod(number)
.map(validtedBooleanTuple => (number, validtedBooleanTuple))
.filter(_._2)
.map(_._1)
})
} yield {
finalIntegerSeq
}
}
关注类型。
在您的第二个代码段中,您通过 Future 调用 filter
,但它没有像您预期的那样工作。因为,它不会从期货集合中删除该元素,而是 returns a failed Future with a NoSuchElementException
,然后使所有代码都因此类异常而失败。
顺便说一句,这是您的工作代码的完善版本,它更加高效和可读。
import scala.concurrent.Future
def validationMethod(n: Int): Future[Boolean] =
Future((n % 2) == 0)
def testMethod() =
for {
seqOfIntegers <- Future {
List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
}
validated <- Future.traverse(seqOfIntegers) { number =>
validationMethod(number).map { boolean =>
number -> boolean
}
}
result = validated.collect {
case (n, true) => n
}
} yield result