Scala:过滤选项集合
假设我有一个函数,用于检查某些操作是否适用于 A 的实例,如果适用,则返回 B 的实例或 None:
def checker[A,B]( a: A ) : Option[B] = ...
现在我想形成一个包含 B 的所有有效实例的新集合,删除 None 值。下面的代码似乎可以完成这项工作,但肯定有更好的方法:
val as = List[A]( a1, a2, a3, ... )
val bs =
as
.map( (a) => checker(a) ) // List[A] => List[Option[B]]
.filter( _.isDefined ) // List[Option[B]] => List[Option[B]]
.map( _.get ) // List[Option[B]] => List[B]
Say I have a function that checks whether some operation is applicable to an instance of A and, if so, returns an instance of B or None:
def checker[A,B]( a: A ) : Option[B] = ...
Now I want to form a new collection that contains all valid instances of B, dropping the None values. The following code seems to do the job, but there is certainly a better way:
val as = List[A]( a1, a2, a3, ... )
val bs =
as
.map( (a) => checker(a) ) // List[A] => List[Option[B]]
.filter( _.isDefined ) // List[Option[B]] => List[Option[B]]
.map( _.get ) // List[Option[B]] => List[B]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这应该可以做到:
This should do it:
上面的答案是正确的,但是如果你可以重写
checker
,我建议你使用PartialFunction
和collect
。 PartialFunction 是类型 A=>B 的函数,无需为 A 的所有值定义。这是一个简单的示例:collect
将 PartialFunction 的实例作为参数,并将其应用于 A 的所有元素集合。在我们的例子中,该函数仅为Ints
定义,并且"5"
被过滤。因此,collect
是map
和filter
的组合,这正是你的情况。The answer above is correct, but if you can rewrite
checker
, I suggest you usePartialFunction
andcollect
. PartialFunction is a function of type A=>B that is not necessary defined for all values of A. Here is a simple example:collect
takes an instance of PartialFunction as argument and applies it to all elements of the collection. In our case the function is defined only forInts
and"5"
is filtered. So,collect
is a combination ofmap
andfilter
, which is exactly your case.