Best practice to validate null and empty collection in Java
If you use the Apache Commons Collections library in your project, you may use the CollectionUtils.isEmpty
and MapUtils.isEmpty()
methods which respectively check if a collection or a map is empty or null (i.e. they are "null-safe").
The code behind these methods is more or less what user @icza has written in his answer.
Regardless of what you do, remember that the less code you write, the less code you need to test as the complexity of your code decreases.
A method to check if a Collection or Map is empty or null?
Your isCollectionMapNullOrEmpty
compiles and works, but not the way you intended.
<T extends Collection, Map>
You've declared two type variables, T
and Map
, where T
must be a Collection
. The type variable Map
has nothing to do with the interface Map
, and is in fact not even used. (Also, you used the raw Collection
interface here.) You are passing aList
which is a Collection
, so it compiles. However, aMap
is not a Collection
, so the compilation fails passing in a Map
.
It looks like you wanted T
to be either a Collection
or a Map
. But Java's generics don't work that way; you can't declare a type parameter to be one thing or another thing.
(As an aside, you can say one thing and another thing: T extends Collection & Map
, or without raw types, T extends Collection<?> & Map<?, ?>
, but I'm not aware of any classes that implement both interfaces.)
You can have two overloaded methods, one for a Collection
and one for a Map
, that will perform the same functionality. Here, I've taken advantage of short-circuiting to combine the statements:
protected static boolean isCollectionMapNullOrEmpty(final Collection<?> c) {
return c == null || c.isEmpty();
}
protected static boolean isCollectionMapNullOrEmpty(final Map<?, ?> m) {
return m == null || m.isEmpty();
}
Both methods have the same exact code, but because there is no super-interface declaring isEmpty
, this appears to be as good as it gets.
Checking if a collection is empty in Java: which is the best method?
You should absolutely use isEmpty()
. Computing the size()
of an arbitrary list could be expensive. Even validating whether it has any elements can be expensive, of course, but there's no optimization for size()
which can't also make isEmpty()
faster, whereas the reverse is not the case.
For example, suppose you had a linked list structure which didn't cache the size (whereas LinkedList<E>
does). Then size()
would become an O(N) operation, whereas isEmpty()
would still be O(1)
.
Additionally of course, using isEmpty()
states what you're actually interested in more clearly.
Check if Java object is Collection, Array or String and empty
As mentioned in deHaar's answer, the code can be improved by using if-return
combinations.
You should however generalize your code a bit more, e.g. support all array types, not just string arrays, and support all collection types, not just lists.
Similarly, String
implements an interface named CharSequence
, so support that instead. That way the code will support classes like StringBuilder
and StringBuffer
too.
public static boolean isEmpty(Object value) {
if (value == null)
return true;
if (value instanceof CharSequence) // String, StringBuilder, StringBuffer, ...
return ((CharSequence) value).isEmpty();
if (value instanceof Collection) // List, Set, Queue, Deque, ...
return ((Collection<?>) value).isEmpty();
if (value instanceof Map)
return ((Map<?,?>) value).isEmpty();
if (value.getClass().isArray()) // All array types
return (Array.getLength(value) == 0);
return false;
}
Code was modified to to use pure built-in methods, i.e. to not rely on ArrayUtils
.
UPDATED: Added support for primitive arrays.
The above implementation is a close match to the JSP EL empty
operator:
The
empty
operator is a prefix operator that can be used to determine if a value is null or empty.To evaluate
empty A
- If
A
isnull
, returntrue
- Otherwise, if
A
is the empty string, then returntrue
- Otherwise, if
A
is an empty array, then returntrue
- Otherwise, if
A
is an emptyMap
, returntrue
- Otherwise, if
A
is an emptyCollection
, returntrue
- Otherwise return
false
How to check if a Map or Set is empty?
You use its size
property. Both Maps and Sets have it (here and here).
const populatedSet = new Set(['foo']);console.log(populatedSet.size); // 1
const populatedMap = new Map([['foo', 1]]);console.log(populatedMap.size); // 1
Java 8 nested null check for a string in a map in a list
You could use a long chain of Optional
and Stream
operations to transform the input step by step into the output. Something like this (untested):
String[] test = Optional.ofNullable(checkList)
.map(Collection::stream)
.orElseGet(Stream::empty)
.findFirst()
.map(m -> m.get("filename"))
.filter(f -> !f.trim().isEmpty())
.map(f -> f.split("_"))
.orElse(null);
I'd strongly encourage you to stop using null
lists and maps. It's a lot better to use empty collections rather than null collections, that way you don't have to have null checks all over the place. Furthermore, don't allow empty or blank strings into your collections; filter them out or replace them with null
early, as soon as you're converting user input into in-memory objects. You don't want to have to insert calls to trim()
and isBlank()
and the like all over the place.
If you did that you could simplify to:
String[] test = checkList.stream()
.findFirst()
.map(m -> m.get("filename"))
.map(f -> f.split("_"))
.orElse(null);
Much nicer, no?
Related Topics
Save Child Objects Automatically Using JPA Hibernate
How to Make the Icon Background of an Android App Transparent
Why Am I Getting the Error "The Method Is Undefined for the Type"
How to Use Jackson to Deserialise an Array of Objects
How to Post Form Data With Spring Resttemplate
Empty Check With String[] Array
Java Execution Pops a New Window and Immediately Disappears
Jsp and CSS File Not Loading in Browser Java Webapp
How to Print the List of Employees Who Have Joined on a Particular Month from an Employee List
Remove Duplicates from a List of Objects Based on Property in Java 8
How to Post a Json Payload to a @Requestparam in Spring MVC
How to Test Code Dependent on Environment Variables Using Junit
How to Parse Json Boolean Value
Gradle: How to Exclude a Particular Package from a Jar
Duplicate Entry Exception: Spring Hibernate/Jpa Cascade Save Many to One