javajava-8java-stream

How to use if-else logic in Java 8 stream forEach


What I want to do is shown below in 2 stream calls. I want to split a collection into 2 new collections based on some condition. Ideally I want to do it in 1. I've seen conditions used for the .map function of streams, but couldn't find anything for the forEach. What is the best way to achieve what I want?

    animalMap.entrySet().stream()
            .filter(pair-> pair.getValue() != null)
            .forEach(pair-> myMap.put(pair.getKey(), pair.getValue()));

    animalMap.entrySet().stream()
            .filter(pair-> pair.getValue() == null)
            .forEach(pair-> myList.add(pair.getKey()));

Solution

  • Just put the condition into the lambda itself, e.g.

    animalMap.entrySet().stream()
            .forEach(
                    pair -> {
                        if (pair.getValue() != null) {
                            myMap.put(pair.getKey(), pair.getValue());
                        } else {
                            myList.add(pair.getKey());
                        }
                    }
            );
    

    This can be simplified and made more readable using Map.forEach, as suggested by Jorn Vernee:

    animalMap.forEach(
            (key, value) -> {
                if (value != null) {
                    myMap.put(key, value);
                } else {
                    myList.add(key);
                }
            }
    );
    

    Of course, these solutions assume that both collections (myMap and myList) are declared and initialized prior to the above pieces of code.