一个元素的延迟过滤器

时间:2014-06-09 15:26:28

标签: scala

我正在重构一些scala代码来教我的同事关于for-comprehension,我有一个像:

for {
  // ...
  result <- components.collectFirst({ case section if section.startsWith(DESIRED_SUBSTRING) => section.substring(section.indexOf(DELIM) + 1).trim() == "true" })
} yield result

那有点长。

首先,我希望我可以跳过result <- ...后面的直接yield,就像我在Haskell中一样,但后来我注意到collectFirst内部正在进行处理。 / p>

所以我认为阅读要容易得多,因为我应该更好地做到这一点

for {
  // ...
  section <- components.filter(_.startsWith(DESIRED_SUBSTRING)).headOption
} yield section.substring(section.indexOf(DELIM) + 1).trim() == "true"

哪个有效,但效率较低,因为filter必须处理所有元素。我希望能够使用惰性过滤器:

components.withFilter(_.startsWith(DESIRED_SUBSTRING)).headOption

FilterMonadic似乎不支持headOption,我无法找到从它支持的操作中获取它的方法。我确信flatMapbf有一种方式,但我现在对scala生态系统并不熟悉。

如果我想坚持标准的图书馆技巧,我坚持

for {
  // ...
  section <- components.collectFirst({ case section if section.startsWith(DESIRED_SUBSTRING) => section })
} yield section.substring(section.indexOf(DELIM) + 1).trim() == "true"

或者我可以使用更好的东西吗?

1 个答案:

答案 0 :(得分:3)

如果您使用的components.find(_.startsWith(DESIRED_SUBSTRING))将为Option提供满足条件的第一个元素。然后,您只需map就可以进行任何后续处理。