从另一个 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
在 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