Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use Streams to return Boolean if all the List values in a Map are empty/not-empty

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).

like image 865
Basil Bourque Avatar asked Feb 09 '16 01:02

Basil Bourque


People also ask

What does stream return if list is empty?

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.

How do you check if a stream is empty or not?

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.

What happens if stream is empty Java?

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.

What is the difference between using streams and classic loops?

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.


1 Answers

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.

like image 188
Peter Lawrey Avatar answered Sep 20 '22 18:09

Peter Lawrey