【问题标题】:Scala equivalent for Javas stream findFirst()Java 流 findFirst() 的 Scala 等价物
【发布时间】:2015-11-04 04:59:58
【问题描述】:

任何人都知道以下 java 流操作的 Scala 等效项 - findFirst()

lst.stream()
    .filter(x -> x > 5)
    .findFirst()

谢谢

【问题讨论】:

  • lst.filter(_ > 5).head
  • 在 java 流中,操作是交错的。 IE。过滤在大于 5 的第一个元素处停止。但在 Scala 普通列表中,它将首先过滤进入列表以创建所有元素的子列表并占据头部。我想要确切的 java 流效果。
  • 如果你想要惰性过滤器,请使用withFilterlist.view.filter(稍后也适用于map 和其他几个常见操作)。如果您需要找到第一个匹配的元素,请使用find

标签: scala java-8 java-stream


【解决方案1】:

您可以简单地使用lst.find(_ > 5),它将返回Option。这与编写lst.filter(_ > 5).headOption 基本相同(但比编写更有效),这也将返回Option 或将headOption 交换为head(非常不鼓励),如果找不到任何内容,则会抛出异常。

【讨论】:

  • 这个操作是一个eger 对吧?它将首先过滤并创建一个子列表,然后采用 head/head 选项对吗?我想要一个懒惰的人,它在获得第一个匹配项时停止过滤(> 5)
  • @Anand,如果您只需要一个元素,请使用find。一旦找到元素,它将立即停止扫描列表。
【解决方案2】:

正如@Aivean 所说:

scala> List(1,2,3,4,5,6,7,8,9,10).view.find(_ > 5)
res0: Option[Int] = Some(6)

查看这些问题:

In Scala, what does "view" do?

What is the difference between the methods iterator and view?

【讨论】:

  • .view 不应该出现在.find 之前,因为.find 会在找到第一个匹配元素后自动停止。
猜你喜欢
  • 2015-08-14
  • 2011-04-17
  • 2010-11-13
  • 2011-12-10
  • 1970-01-01
  • 2010-12-11
  • 2016-07-05
  • 2021-08-07
  • 1970-01-01
相关资源
最近更新 更多