首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala的for- statements `‘s’语句

Scala的for- statements `‘s’语句
EN

Stack Overflow用户
提问于 2011-10-31 11:36:21
回答 2查看 52.6K关注 0票数 28

在scala中,是否可以专门研究if中的条件以便理解?我是这样想的:

代码语言:javascript
复制
val collection: SomeGenericCollection[Int] = ...

trait CollectionFilter
case object Even extends CollectionFilter
case object Odd extends CollectionFilter

val evenColl = for { i <- collection if(Even) } yield i
//evenColl would be a SomeGenericEvenCollection instance

val oddColl = for { i <- collection if(Odd) } yield i
//oddColl would be a SomeGenericOddCollection instance

要点是,通过生成i,我得到了一个潜在不同类型的新集合(因此我将其称为“专门化”)-而不仅仅是同一个GenericCollection类型的过滤版本。

我问这个问题的原因是我看到了一些我无法理解的东西(一个例子可以在on line 33 of this ScalaQuery example找到。它所做的是为一个数据库(即SELECT ... FROM ... WHERE ...)创建一个查询,我原本希望它遍历该查询的结果。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-31 12:02:51

因此,我认为您是在问是否可以在for-comprehension中使用if语句来更改结果类型。答案是“是的,但是……”。

首先,理解for-comprehensions是如何扩展的。在Stack Overflow上有一些问题在讨论它,还有一些参数可以传递给编译器,这样它就会告诉你发生了什么。

不管怎样,这段代码:

代码语言:javascript
复制
val evenColl = for { i <- collection if(Even) } yield i

翻译为:

代码语言:javascript
复制
val evenColl = collection.withFilter(i => Even).map(i => i)

因此,如果withFilter方法更改了集合类型,它将执行您想要的操作--在这个简单的例子中。在更复杂的情况下,单凭这一点是行不通的:

代码语言:javascript
复制
for {
  x <- xs
  y <- ys
  if cond
} yield (x, y)

被翻译为

代码语言:javascript
复制
xs.flatMap(ys.withFilter(y => cond).map(y => (x, y)))

在这种情况下,flatMap将决定返回哪种类型。如果它从返回的结果中得到提示,那么它就可以工作。

现在,在Scala Collections上,withFilter不会改变集合的类型。但是,您也可以编写自己的类来实现这一点。

票数 57
EN

Stack Overflow用户

发布于 2011-10-31 12:02:37

是的,你可以--请参考this tutorial获取一个简单的例子。您引用的scala查询示例也在对集合进行迭代,然后使用该数据构建查询。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7949785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档