javacollectionsguava

Library method to partition a collection by a predicate


I have a collection of objects that I would like to partition into two collections, one of which passes a predicate and one of which fails a predicate. I was hoping there would be a Guava method to do this, but the closest they come is filter, which doesn't give me the other collection.

I would image the signature of the method would be something like this:

public static <E> Pair<Collection<E>, Collection<E>> partition(Collection<E> source, Predicate<? super E> predicate)

I realize this is super fast to code myself, but I'm looking for an existing library method that does what I want.


Solution

  • Use Guava's Multimaps.index.

    Here is an example, which partitions a list of words into two parts: those which have length > 3 and those that don't.

    List<String> words = Arrays.asList("foo", "bar", "hello", "world");
    
    ImmutableListMultimap<Boolean, String> partitionedMap = Multimaps.index(words, new Function<String, Boolean>(){
        @Override
        public Boolean apply(String input) {
            return input.length() > 3;
        }
    });
    System.out.println(partitionedMap);
    

    prints:

    false=[foo, bar], true=[hello, world]