如何在列表中查找匹配元素并将其映射为 Scala API 方法?

发布于 2024-10-27 18:45:21 字数 165 浏览 2 评论 0原文

有没有一种方法可以执行以下操作而不执行这两种方法:findmap

val l = 0 to 3
l.find(_ * 33 % 2 == 0).map(_ * 33) // returns Some(66)

Is there a method to do the following without doing both methods: find and map?

val l = 0 to 3
l.find(_ * 33 % 2 == 0).map(_ * 33) // returns Some(66)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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

评论(4

給妳壹絲溫柔 2024-11-03 18:45:22

使用收集怎么样?

// Returns List(66)
List(1, 2, 3) collect { case i if (i * 33 % 2 == 0) => i * 33 }

但是,这将返回所有匹配项,而不仅仅是第一个匹配项。

更好的答案是基于 Scala 2.9:恐怕

// Returns Some(66)
List(1, 2, 3) collectFirst { case i if (i * 33 % 2 == 0) => i * 33 }

评论中建议的解决方案是附加一个 head 来获取 Scala 2.8 版本,效率不是很高。也许在那种情况下我会坚持你自己的代码。无论如何,为了确保它返回一个选项,您不应该调用 head,而应该调用 headOption

// Returns Some(66)
List(1, 2, 3) collect { case i if (i * 33 % 2 == 0) => i * 33 } headOption

How about using collect?

// Returns List(66)
List(1, 2, 3) collect { case i if (i * 33 % 2 == 0) => i * 33 }

However that will return all matches and not just the first one.

The better answer would have been, based on Scala 2.9:

// Returns Some(66)
List(1, 2, 3) collectFirst { case i if (i * 33 % 2 == 0) => i * 33 }

The solution suggested in the comments to append a head to get a Scala 2.8 version of that is not very efficient, I'm afraid. Perhaps in that case I would stick to your own code. In any case, in order to make sure it returns an option, you should not call head, but headOption.

// Returns Some(66)
List(1, 2, 3) collect { case i if (i * 33 % 2 == 0) => i * 33 } headOption
记忆之渊 2024-11-03 18:45:22

如果您不想多次执行 map() 操作(例如,如果这是一次昂贵的数据库查找),您可以这样做:

l.view.map(_ * 33) .find(_ % 2 == 0)

view 使集合变得惰性,因此 map() 操作的数量被最小化。

If you don't want to do your map() operation multiple times (for instance if it's an expensive DB lookup) you can do this:

l.view.map(_ * 33).find(_ % 2 == 0)

The view makes the collection lazy, so the number of map() operations is minimized.

八巷 2024-11-03 18:45:22

嘿看,又是我的小伙伴findMap

/**
 * Finds the first element in the list that satisfies the partial function, then 
 * maps it through the function.
 */
def findMap[A,B](in: Traversable[A])(f: PartialFunction[A,B]): Option[B] = {
  in.find(f.isDefinedAt(_)).map(f(_))
}

请注意,与已接受的答案不同,但就像其注释中提到的 collectFirst 方法一样,这个人一旦找到匹配的元素就会停止。

Hey look, it's my little buddy findMap again!

/**
 * Finds the first element in the list that satisfies the partial function, then 
 * maps it through the function.
 */
def findMap[A,B](in: Traversable[A])(f: PartialFunction[A,B]): Option[B] = {
  in.find(f.isDefinedAt(_)).map(f(_))
}

Note that, unlike in the accepted answer, but like the collectFirst method mentioned in one of its comments, this guy stops as soon as he finds a matching element.

衣神在巴黎 2024-11-03 18:45:22

这可以做到,但如果你告诉你真正想要实现的目标会更容易:

l.flatMap(n => if (n * 33 % 2 == 0) Some(n * 33) else None).headOption

This can do it, but it would be easier if you tell what you're really trying to achieve:

l.flatMap(n => if (n * 33 % 2 == 0) Some(n * 33) else None).headOption
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文