这可能听起来像是我要求开始一场火焰战,但是听我说。
在某些语言中,懒惰是昂贵的。例如,在Ruby中,我有最近的经验,懒惰是缓慢的,因为它是使用纤维实现的,所以它在以下情况下才有吸引力:
否则你肯定会想要使用正常的,急切的方法。
我的初步调查显示,Elixir中懒惰的开销要低得多(reddit上的this thread支持我),所以似乎没有理由使用Enum而不是Stream来处理Stream可以做的事情。
我是否缺少某些东西,因为我认为Enum存在是有原因的,并且实现了一些与Stream相同的功能。如果有的话,我可以在使用Stream时使用Enum而不是Stream?
答案 0 :(得分:9)
对于简短列表,Stream将比简单地使用Enum慢,但没有明确的规则,如果没有准确的基准测试你正在做什么。 Enum中也存在一些函数,但在Stream中没有相应的函数。 (例如,Enum.reverse)
你需要两者的真正原因是Stream只是功能的组合。需要结果而不是副作用的每个管道都需要以Enum结束才能运行管道。
他们齐头并进,Stream无法独自站立。 Stream正在做的主要是为您提供非常方便的抽象,以创建非常复杂的reduce函数。
答案 1 :(得分:7)
Stream中的方法基本上创建了一个"配方列表"当Enum中的方法实际解决这些转换时,对数据进行转换。因此,即使其他所有内容都是Stream,您最终也必须使用Enum函数来解析数据转换。
另外一些概念,即Reduce,在Stream中没有实际意义,你必须使用Enum。
至于性能,如果您正在进行一系列转换,可能是无限的数据流,或者您正在读取文件,请使用Stream。如果您只对有限可枚举进行一次转换,或者需要解析流,请使用枚举。