Java - Check Not Null/Empty else assign default value
JavaInlineTernaryJava Problem Overview
I am trying to simplify the following code.
The basic steps that the code should carry out are as follows:
- Assign String a default value
- Run a method
- If the method returns a null/empty string leave the String as default
- If the method returns a valid string set the String to this result
A Simple example would be:
String temp = System.getProperty("XYZ");
String result = "default";
if(temp != null && !temp.isEmpty()){
result = temp;
}
I have made another attemp using a ternary operator:
String temp;
String result = isNotNullOrEmpty(temp = System.getProperty("XYZ")) ? temp : "default";
The isNotNullOrEmpty() Method
private static boolean isNotNullOrEmpty(String str){
return (str != null && !str.isEmpty());
}
Is it possible to do all of this in-line? I know I could do something like this:
String result = isNotNullOrEmpty(System.getProperty("XYZ")) ? System.getProperty("XYZ") : "default";
But I am calling the same method twice. I would be something like to do something like this (which doesn't work):
String result = isNotNullOrEmpty(String temp = System.getProperty("XYZ")) ? temp : "default";
I would like to initialize the 'temp' String within the same line. Is this possible? Or what should I be doing?
Thank you for your suggestions.
Tim
Java Solutions
Solution 1 - Java
Use Java 8 Optional
(no filter needed):
public static String orElse(String defaultValue) {
return Optional.ofNullable(System.getProperty("property")).orElse(defaultValue);
}
Solution 2 - Java
I know the question is really old, but with generics one can add a more generalized method with will work for all types.
public static <T> T getValueOrDefault(T value, T defaultValue) {
return value == null ? defaultValue : value;
}
Solution 3 - Java
If using JDK 9 +, use Objects.requireNonNullElse(T obj, T defaultObj)
Solution 4 - Java
Use org.apache.commons.lang3.StringUtils
String emptyString = new String();
result = StringUtils.defaultIfEmpty(emptyString, "default");
System.out.println(result);
String nullString = null;
result = StringUtils.defaultIfEmpty(nullString, "default");
System.out.println(result);
Both of the above options will print:
> default > > default
Solution 5 - Java
You can use this method in the ObjectUtils
class from org.apache.commons.lang3 library :
public static <T> T defaultIfNull(T object, T defaultValue)
Solution 6 - Java
Sounds like you probably want a simple method like this:
public String getValueOrDefault(String value, String defaultValue) {
return isNotNullOrEmpty(value) ? value : defaultValue;
}
Then:
String result = getValueOrDefault(System.getProperty("XYZ"), "default");
At this point, you don't need temp
... you've effectively used the method parameter as a way of initializing the temporary variable.
If you really want temp
and you don't want an extra method, you can do it in one statement, but I really wouldn't:
public class Test {
public static void main(String[] args) {
String temp, result = isNotNullOrEmpty(temp = System.getProperty("XYZ")) ? temp : "default";
System.out.println("result: " + result);
System.out.println("temp: " + temp);
}
private static boolean isNotNullOrEmpty(String str) {
return str != null && !str.isEmpty();
}
}
Solution 7 - Java
With guava you can use
MoreObjects.firstNonNull(possiblyNullString, defaultValue);
Solution 8 - Java
This is the best solution IMHO. It covers BOTH null
and empty
scenario, as is easy to understand when reading the code. All you need to know is that .getProperty
returns a null
when system prop is not set:
String DEFAULT_XYZ = System.getProperty("user.home") + "/xyz";
String PROP = Optional.ofNullable(System.getProperty("XYZ"))
.filter(s -> !s.isEmpty())
.orElse(DEFAULT_XYZ);
Solution 9 - Java
In Java 9, if you have an object which has another object as property and that nested objects has a method yielding a string, then you can use this construct to return an empty string if the embeded object is null :
String label = Optional.ofNullable(org.getDiffusion()).map(Diffusion::getLabel).orElse("")
In this example :
org
is an instance of an object of typeOrganism
Organism
has aDiffusion
property (another object)Diffusion
has aString label
property (andgetLabel()
getter).
With this example, if org.getDiffusion()
is not null, then it returns the getLabel
property of its Diffusion
object (this returns a String
). Otherwise, it returns an empty string.
Solution 10 - Java
If you need to set not null value or return default value instead you can use simple generic method
private <T> T getIfNotNullOrElse(T input, T data) {
return Optional.ofNullable(input).orElse(data);
}