Why `map` requires `collect` to use for general iterable things?

Also, perhaps this is a better example for mapping over arbitrary iterables:

julia> i = Iterators.filter(iseven, 1:20)
Base.Iterators.Filter{typeof(iseven), UnitRange{Int64}}(iseven, 1:20)

julia> map(println, i)
2
4
6
8
10
12
14
16
18
20
10-element Vector{Nothing}:
 nothing
 nothing
 nothing
 nothing
 nothing
 nothing
 nothing
 nothing
 nothing
 nothing

As you can see, map returns a collection of the return values, even for arbitrary iterables. For some functions like println, that’s probably not what you want though, since it (needlessly) ends up allocating a Vector full of nothing.