从另一个 Stream 中减去一个 Stream

Subtracting one Stream from the other

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

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] 是一个列表,而不是一个流。

您需要提前收集第二个流,以便您可以测试其中是否存在元素。下面介绍如何将其收集到 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