Scala过滤器对布尔内部的未来进行理解

Scala filter on future of boolean inside for comprehension

我正在尝试验证项目序列的未来。我的validate方法还返回布尔值的未来。我能够使其正常运行,但是我不确定自己是否了解这里发生的事情。

因此,我有一个有效的代码,一个无效的代码。有人知道这里发生了什么吗?
还有如何通过在地图后链接过滤器使它工作,以使其全部集中在一个位置而不必稍后使用分配呢?

1
2
3
4
5
6
def main(args: Array[String]): Unit = {
    println(Await.result(testMethod(), Duration.Inf))
}
def validationMethod(n: Int) = {
    Future { n % 2 == 0 }
}

有效的代码:

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
  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,这无法按预期工作。因为,它不会从期货集合中删除该元素,而是返回带有NoSuchElementException的失败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