Scala:过滤选项集合

发布于 2024-12-07 02:19:08 字数 494 浏览 2 评论 0原文

假设我有一个函数,用于检查某些操作是否适用于 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

仅冇旳回忆 2024-12-14 02:19:08

这应该可以做到:

val bs = as.flatMap(checker)

This should do it:

val bs = as.flatMap(checker)
赢得她心 2024-12-14 02:19:08

上面的答案是正确的,但是如果你可以重写checker,我建议你使用PartialFunctioncollect。 PartialFunction 是类型 A=>B 的函数,无需为 A 的所有值定义。这是一个简单的示例:

scala> List(1, 2, 3, 4, "5") collect {case x : Int => x + 42}
res1: List[Int] = List(43, 44, 45, 46)

collect 将 PartialFunction 的实例作为参数,并将其应用于 A 的所有元素集合。在我们的例子中,该函数仅为 Ints 定义,并且 "5" 被过滤。因此,collectmapfilter的组合,这正是你的情况。

The answer above is correct, but if you can rewrite checker, I suggest you use PartialFunction and collect. PartialFunction is a function of type A=>B that is not necessary defined for all values of A. Here is a simple example:

scala> List(1, 2, 3, 4, "5") collect {case x : Int => x + 42}
res1: List[Int] = List(43, 44, 45, 46)

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 for Ints and "5" is filtered. So, collect is a combination of map and filter, which is exactly your case.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文