I am trying to simplify the following code.
The basic steps that the code should carry out are as follows:
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
You can use this method in the ObjectUtils
class from org.apache.commons.lang3 library :
public static <T> T defaultIfNull(T object, T defaultValue)
Use Java 8 Optional
(no filter needed):
public static String orElse(String defaultValue) {
return Optional.ofNullable(System.getProperty("property")).orElse(defaultValue);
}
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);
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
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();
}
}
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 type Organism
Organism
has a Diffusion
property (another object)Diffusion
has a String label
property (and getLabel()
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.
If using JDK 9 +, use Objects.requireNonNullElse(T obj, T defaultObj)
With guava you can use
MoreObjects.firstNonNull(possiblyNullString, defaultValue);
Source: Stackoverflow.com