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

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

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

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,10) }
      finalIntegerSeq <- Future.sequence(seqOfIntegers.map {
        number =>
          validationmethod(number)
            .map(validtedBooleanTuple => (number,validtedBooleanTuple))
            .filter(_._2)
            .map(_._1)
      })
    } yield {
      finalIntegerSeq
    }
  }
yunmengyao1_ 回答:Scala过滤器对布尔内部的未来进行理解

遵循类型。
在第二个代码段中,您正在通过未来呼叫filter,该呼叫无法正常工作。既然如此,它不会从期货集合中删除该元素,而是返回带有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
本文链接:https://www.f2er.com/2629858.html

大家都在问