Given a Map
mapping a String to a List
, is there a way to use Java Streams to return a Boolean where TRUE means one or more list had elements? If all lists in the map were empty, return FALSE.
Map< String , List<String> > map = …
Can use of Streams replace this conventional code?
// See if any diffs were found. Loop through the Map, look at each List of diffs to see if non-empty. boolean anyElementsInAnyList = false; for (List<String> list : map.values () ) { if (!list.isEmpty()) { anyElementsInAnyList = true; break; } }
Note that we can break out of the examination after the first finding. No need to examine all the Map values (all the Lists). Would be nice if, for efficiency, the Stream could do the same stop-work-on-first-finding (a “short-circuiting” operation).
toList()) , you'll always get an output List (you'll never get null ). If the Stream is empty (and it doesn't matter if it's empty due to the source of the stream being empty, or due to all the elements of the stream being filtered out prior to the terminal operation), the output List will be empty too.
You have to consume the stream to find out if it's empty. That's the point of Stream's semantics (laziness). To check that the stream is not empty you have to attempt to consume at least one element. At that point the stream has lost its "virginity" and cannot be consumed again from the start.
Return Value : Stream empty() returns an empty sequential stream. Note : An empty stream might be useful to avoid null pointer exceptions while callings methods with stream parameters.
Remember that loops use an imperative style and Streams a declarative style, so Streams are likely to be much easier to maintain. If you have a small list, loops perform better. If you have a huge list, a parallel stream will perform better.
Stream::allMatch
In Java 8 you can check that not all lists are empty.
boolean anyNonEmpty = !map.values().stream().allMatch(List::isEmpty);
Notice that Stream::allMatch
is a short-circuiting terminal operation. So the stream is efficient, not running any longer than need be.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With