【问题标题】:Scala filter on future of boolean inside for comprehensionScala过滤器内部布尔值的未来以进行理解
【发布时间】:2020-06-28 22:07:58
【问题描述】:

我正在尝试验证项目序列的未来。我的验证方法还返回布尔值的未来。我能够让它工作,但我不确定我自己是否理解这里发生的事情。

所以,我有一个有效的代码和一个无效的代码。有人知道这里发生了什么吗? 另外如何通过在地图之后链接过滤器来使其工作,以便将其全部集中在一个地方并且以后不必使用分配?

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
    }
  }

【问题讨论】:

    标签: scala future scala-collections for-comprehension


    【解决方案1】:

    关注类型。
    在您的第二次 sn-p 中,您通过 Future 调用 filter,这并没有像您预期的那样工作。因为,它不会从期货集合中删除该元素,而是返回带有NoSuchElementExceptionfailed Future,然后使所有代码失败这样的例外。

    顺便说一句,这是您的工作代码的完善版本,它更高效且可读性更高。

    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
    

    【讨论】:

      猜你喜欢
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 2022-10-25
      • 1970-01-01
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      • 2013-07-13
      相关资源
      最近更新 更多