Design for collections upgrades

Lawrence Kesteloot lk at
Tue Mar 8 13:37:37 PST 2011

On Tue, Mar 8, 2011 at 1:24 PM, Brian Goetz <brian.goetz at> wrote:
> This can be replaced by the one liner:
> ArrayList<T> filtered = otherList.filter(predicate);

This isn't a very strong argument, since the following is more clear
and flexible:

ArrayList<T> filtered = new ArrayList(otherList.filter(predicate));

(Assuming that filter() returns a Stream and that an ArrayList
constructor takes one. This also answers Remi's question about

A better argument against making filter() return a stream is that it's
unexpected. The verb "filter" means "filter", not "create a stream
that when later evaluated will filter." You can imagine users putting
logging statements in their predicates, calling:


and not seeing anything logged. Or programmers repeatedly evaluating
the contents of the stream, not realizing that they're calling the
predicate every time. I don't feel strongly that we must have an eager
API, but I do feel like we can't have a streaming API that looks like
an eager one.


More information about the lambda-dev mailing list