当前位置: 首页 > 知识库问答 >
问题:

用于理解的Scala-带有复杂过滤器的产量

程成天
2023-03-14

我正在尝试在Scala中构建一个理解,但是当我尝试使用更复杂的过滤器时遇到了一些问题。

我知道理解过滤的基础:

for (x <- 1 until 20 if x>3) yield {
  x
}

但是,我想构建一个具有更复杂的过滤语句的for理解。例如,这里有一个我正在尝试做的说明性版本:

for (
    element <- elementList
    val otherElement = databaseCall.getMatching(element.id)
    if element.name==otherElement.name
) yield {
  element
}

基本上,如果您想使用一些更复杂的需求进行筛选,这会变得很尴尬,因为for理解不允许在filter语句中声明变量,否则您必须将所有这些都适合一行。

另一种选择是根本不使用过滤机制,只生成一些(element)或没有,最终得到选项[elementType]列表。但是,在这种情况下,我不希望有可选类型。

强制性地,我将简单地创建一个可变列表,并且只在满足我的条件时追加到列表中,但是我想看看如何以更声明性的方式做到这一点(还不完全是声明性的,但是我仍在学习!).

任何好的声明式方法的建议都会非常有帮助。

共有2个答案

童冠玉
2023-03-14

看起来你正在做一些有副作用的地图。这些副作用可能导致异常,这反过来又可能导致您可能希望避免的结果列表。因此,在您要执行的操作范围内围绕您尝试执行的操作使用闭包:

 def outerScope(elementList: List[YourType]): List[YourType] =
   def dbAction(element: YourType): Option[YourType] = try{
     val other = databaseCall getMatching element.id //assuming can't return null
     if(other.name == element.name) Some(element) else None
   }
   catch{
     case ex: Exception => None //don't forget to log it
   }

   for{
     elem <- elementList
     value <- dbAction(elem)
   } yield value
 }

正如你已经发现的,让for comprehension包含并做所有事情有时会导致相当冗长或混乱的陈述。因为理解应该是易读的和直观的。把这些条件分开,这样你就可以得到你想要的结果,即使这意味着所有的逻辑都不在理解范围内。

附注:如果DB查询可以返回一个< code>null,那么更好的方法是将调用封装在一个< code>Option中。

酆华皓
2023-03-14

在这种情况下,使用List的过滤方法不是最简单的解决方案吗?:

elementList.filter(el => databaseCall.getMatching(el.id).name == el.name)
 类似资料:
  • 在下面的示例中,我得到异常 当检查< code>if( i == 2 )失败时,我希望得到结果< code>Future( Test2 )。我如何在一个处理组合未来的for理解中处理filter/if? 下面是一个在Scala REPL中工作的简化示例。 代码:

  • 下面是代码示例: 错误是: 错误:(17,13)value withFilter不是cats的成员。数据ReaderT[测试q.this.FailFast,映射[字符串,字符串],布尔值]b1 如何使用f2组合f1。f2必须仅在f1返回右(true)时应用。我通过以下方式解决了它: 但我希望有一个更优雅的解决方案。

  • Scala使用什么模式来处理这种情况: 你有很多未来(它们可以是任何东西,但为了举例…) 你有一个返回未来的函数 我想做这样的事情: 我想返回一个值,但是我在rent语句中调用foF,我会得到一个

  • 问题内容: 我正在尝试建立一个查询,该查询将找到所有用户文档(docType =用户),然后根据许多过滤器对其进行过滤。例如位置,性别,年龄等。过滤器是根据我正在构建的搜索功能上的用户输入来添加/删除的。 以下没有结果: 以下返回结果: 后者虽然返回结果,但从长远来看是行不通的,因为我可能想为年龄,性别等添加一个额外的过滤器,而且我似乎无法添加多个字段。如果我删除位置过滤器,则第一个查询有效。 问

  • 问题内容: 我想通过每行的功能来过滤行,例如 或者再举一个更复杂,人为的例子, 我该怎么办? 问题答案: 您可以使用来执行此操作,该功能会沿给定轴应用功能,

  • 本文向大家介绍django 自定义过滤器(filter)处理较为复杂的变量方法,包括了django 自定义过滤器(filter)处理较为复杂的变量方法的使用技巧和注意事项,需要的朋友参考一下 简述:django 在views中有数据需要通过字典(dict)的方式传递给template,该字典中又包含了字典,而且字典中的键值还是一个对象,在template中处理传递过来的数据的时候,字典不能通过键值