从另一个中减去一个流

时间:2017-11-26 07:23:18

标签: stream elixir difference subtraction

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

position: relative;

iex> [1,2,3,4] -- [2,3] [1,4] 类型是否存在类似函数?

试图实现这一点,我有:

Stream

然而这失败了,因为 def stream_subtract(enum, []), do: Enum.to_list(enum) def stream_subtract(enum1, enum2) do head = Stream.take(enum2, 1) new_enum1 = Stream.drop_while(enum1, &([&1] == head)) stream_subtract(new_enum1, Stream.drop(enum2, 1)) end 是一个列表,而不是一个流。

1 个答案:

答案 0 :(得分:4)

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

此外,Stream.drop_while只会从流的开头删除。如果你想从任意位置掉落,你需要使用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)

输出:

1
4