【发布时间】:2016-02-07 13:00:43
【问题描述】:
我正在努力使这个要求尽可能高效,因为它是组合问题解决器的一部分,所以每一点都有助于实现宏伟的计划。
假设我有一个元素列表,在本例中称为转换。
val possibleTransitions : List[Transition] = List[...] //coming from somewhere
我想在每个转换上执行一个(有点昂贵的)计算,以获得另一个对象,在本例中称为State。
我这样做的自然方式是使用for-comprehension 或map。前者对我来说更方便,因为我想过滤掉一些不相关的State对象,比如之前已经处理过的对象。
val newStates = for {
transition <- possibleTransitions
state <- computeExpensiveOperation(transition)
if (confirmNewState(state))
} yield state
State 包含一个值,我们称之为value(),它表示该状态的某种吸引力。如果value() 非常低(有吸引力),我想丢弃列表的其余部分并使用它。由于possibleTransitions 可能是一个很长的列表(数千个),理想情况下,如果第一个State 对象已经拥有我想要的value(),我最好避免这样做computeExpensiveOperation。
另一方面,如果我没有找到具有吸引力的value() 的任何项目,我想保留所有并将它们添加到另一个列表中。
val newPending = pending ++ newStates
我试图为此使用Stream,以避免在处理它们之前计算所有值。如果我使用 find() 并且我没有找到所需的项目,那么我将无法在流中获取项目(因为它使用一次)。
目前我唯一能看到的是在for-comprehension 中使用possibleItems.toStream() 并创建另一个集合,逐个遍历每个项目,直到找到该项目(并丢弃该集合)或没有(并将集合与所有项目一起使用)。
我错过了一些更聪明更有效的方法吗?
【问题讨论】:
标签: list scala stream for-comprehension