Assume that you want to build a copy of an ImmutableSet
/List
/Map
object but filter out some of the original entries. One way to implement that is the following:
ImmutableList.copyOf(Iterables.filter(myObject, myObject.EQUALS));
where myObject.EQUALS
is a predicate for the Iterables.filter()
operation. I think this is a pretty elegant and easy-to-read implementation. However, one builds two list objects (first through the Iterables.filter(...)
call, second through ImmutableList.copyOf(...)
) which is very inefficient.
Does anybody know of a more efficient way to do it?
I guess the best thing would be to add filter predicates to the ImmutableSet
/List
/Map
builders so that the object must be constructed only once. But unfortunately there is no such parameter.
Look at Guava's Iterators
Specifically filter(Iterator unfiltered, Predicate predicate)
The result of
Iterables.filter()
is just a view over the data inmyObject
: the new list is only built byImmutableList.copyOf()
using the filtering iterator provided by theIterable