我正在重构一些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
,我无法找到从它支持的操作中获取它的方法。我确信flatMap
和bf
有一种方式,但我现在对scala生态系统并不熟悉。
如果我想坚持标准的图书馆技巧,我坚持
for {
// ...
section <- components.collectFirst({ case section if section.startsWith(DESIRED_SUBSTRING) => section })
} yield section.substring(section.indexOf(DELIM) + 1).trim() == "true"
或者我可以使用更好的东西吗?
答案 0 :(得分:3)
如果您使用的components.find(_.startsWith(DESIRED_SUBSTRING))
将为Option
提供满足条件的第一个元素。然后,您只需map
就可以进行任何后续处理。