Stream 从一个流中减去另一个流

Stream 从一个流中减去另一个流,stream,elixir,difference,subtraction,Stream,Elixir,Difference,Subtraction,在Elixir中,您可以执行以下操作: iex>[1,2,3,4]-[2,3] [1,4] 对于流类型是否有分析功能 为了实现这一点,我有: def stream_subtract(枚举,[]),do:enum.to_list(枚举) def stream_减法(枚举1,枚举2)do head=Stream.take(枚举2,1) new_enum1=Stream.drop_while(enum1,&([&1]==head)) stream_subtract(新的_枚举1,stream.dro

在Elixir中,您可以执行以下操作:

iex>[1,2,3,4]-[2,3]
[1,4]
对于
类型是否有分析功能

为了实现这一点,我有:

def stream_subtract(枚举,[]),do:enum.to_list(枚举)
def stream_减法(枚举1,枚举2)do
head=Stream.take(枚举2,1)
new_enum1=Stream.drop_while(enum1,&([&1]==head))
stream_subtract(新的_枚举1,stream.drop(枚举2,1))
结束

但是这失败了,因为
[&1]
是一个列表,而不是流。

您需要提前收集第二个流,以便测试其中是否存在元素。下面是如何将其收集到地图集中,然后使用它过滤第一个流

另外,
Stream.drop\u而
只会从流的开始处删除。如果要从任意位置拖放,则需要使用
Stream.reject

# Our two streams
foo = 1..10 |> Stream.take(4)
bar = 1..10 |> Stream.drop(1) |> Stream.take(2)

# Collect the second stream into a MapSet
bar = bar |> Enum.into(MapSet.new)

# Filter the first stream and print all items:
foo = foo |> Stream.reject(fn x -> x in bar end)
for f <- foo, do: IO.inspect(f)

谢谢-这里使用MapSet对我来说特别有教育意义。如果你真的想处理实时流,其中一个流必须等待另一个流中的相关元素,那么Elixir的
可能是前进的方向
1
4