Scala filter on future of boolean inside for comprehension
我正在尝试验证项目序列的未来。我的validate方法还返回布尔值的未来。我能够使其正常运行,但是我不确定自己是否了解这里发生的事情。
因此,我有一个有效的代码,一个无效的代码。有人知道这里发生了什么吗?
还有如何通过在地图后链接过滤器使它工作,以使其全部集中在一个位置而不必稍后使用分配呢?
1 2 3 4 5 6 |
有效的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 } |
无效的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
遵循类型。
在第二个代码段中,您正在通过Future调用
顺便说一句,这是您的工作代码的精简版本,它效率更高,可读性更高。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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 |