Java - 检查 Not Null/Empty 否则分配默认值
Java - Check Not Null/Empty else assign default value
我正在尝试简化以下代码。
代码应执行的基本步骤如下:
- 为字符串分配默认值
- 运行一个方法
- 如果方法 returns 一个 null/empty 字符串保留字符串为默认值
- 如果方法 returns 一个有效的字符串设置字符串为此结果
一个简单的例子是:
String temp = System.getProperty("XYZ");
String result = "default";
if(temp != null && !temp.isEmpty()){
result = temp;
}
我已经使用三元运算符进行了另一次尝试:
String temp;
String result = isNotNullOrEmpty(temp = System.getProperty("XYZ")) ? temp : "default";
isNotNullOrEmpty() 方法
private static boolean isNotNullOrEmpty(String str){
return (str != null && !str.isEmpty());
}
是否可以在线完成所有这些操作?我知道我可以做这样的事情:
String result = isNotNullOrEmpty(System.getProperty("XYZ")) ? System.getProperty("XYZ") : "default";
但是我调用了同一个方法两次。我会喜欢做这样的事情(这是行不通的):
String result = isNotNullOrEmpty(String temp = System.getProperty("XYZ")) ? temp : "default";
我想在同一行中初始化 'temp' 字符串。这可能吗?或者我应该做什么?
感谢您的建议。
蒂姆
听起来您可能想要一个像这样的简单方法:
public String getValueOrDefault(String value, String defaultValue) {
return isNotNullOrEmpty(value) ? value : defaultValue;
}
然后:
String result = getValueOrDefault(System.getProperty("XYZ"), "default");
此时,您不需要 temp
...您已经有效地使用方法参数作为初始化临时变量的方式。
如果您真的想要temp
并且您不想要额外的方法,您可以一次完成声明,但我真的不会:
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();
}
}
使用Java 8 Optional
(不需要过滤器):
public static String orElse(String defaultValue) {
return Optional.ofNullable(System.getProperty("property")).orElse(defaultValue);
}
使用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);
以上两个选项都会打印:
default
default
我知道这个问题真的很老了,但是使用泛型可以添加一种更通用的方法,适用于所有类型。
public static <T> T getValueOrDefault(T value, T defaultValue) {
return value == null ? defaultValue : value;
}
您可以在 org.apache.commons.lang3 库的 ObjectUtils
class 中使用此方法:
public static <T> T defaultIfNull(T object, T defaultValue)
如果使用JDK 9+,使用Objects.requireNonNullElse(T obj, T defaultObj)
对于番石榴,您可以使用
MoreObjects.firstNonNull(possiblyNullString, defaultValue);
恕我直言,这是最好的解决方案。它涵盖了 null
和 empty
场景,阅读代码时很容易理解。你需要知道的是 .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);
在 Java 9 中,如果你有一个对象有另一个对象 属性 并且嵌套对象有一个方法产生一个字符串,那么你可以使用这个结构来 return 如果嵌入对象为空,则为空字符串:
String label = Optional.ofNullable(org.getDiffusion()).map(Diffusion::getLabel).orElse("")
在这个例子中:
org
是类型 Organism
对象的实例
Organism
有一个 Diffusion
属性(另一个对象)
Diffusion
有一个 String label
属性(和 getLabel()
getter)。
在此示例中,如果 org.getDiffusion()
不为空,则它 return 是其 Diffusion
对象的 getLabel
属性(此 returns 一个 String
)。否则,它 return 是一个空字符串。
如果您需要设置非空值或return默认值,您可以使用简单的通用方法
private <T> T getIfNotNullOrElse(T input, T data) {
return Optional.ofNullable(input).orElse(data);
}
我正在尝试简化以下代码。
代码应执行的基本步骤如下:
- 为字符串分配默认值
- 运行一个方法
- 如果方法 returns 一个 null/empty 字符串保留字符串为默认值
- 如果方法 returns 一个有效的字符串设置字符串为此结果
一个简单的例子是:
String temp = System.getProperty("XYZ");
String result = "default";
if(temp != null && !temp.isEmpty()){
result = temp;
}
我已经使用三元运算符进行了另一次尝试:
String temp;
String result = isNotNullOrEmpty(temp = System.getProperty("XYZ")) ? temp : "default";
isNotNullOrEmpty() 方法
private static boolean isNotNullOrEmpty(String str){
return (str != null && !str.isEmpty());
}
是否可以在线完成所有这些操作?我知道我可以做这样的事情:
String result = isNotNullOrEmpty(System.getProperty("XYZ")) ? System.getProperty("XYZ") : "default";
但是我调用了同一个方法两次。我会喜欢做这样的事情(这是行不通的):
String result = isNotNullOrEmpty(String temp = System.getProperty("XYZ")) ? temp : "default";
我想在同一行中初始化 'temp' 字符串。这可能吗?或者我应该做什么?
感谢您的建议。
蒂姆
听起来您可能想要一个像这样的简单方法:
public String getValueOrDefault(String value, String defaultValue) {
return isNotNullOrEmpty(value) ? value : defaultValue;
}
然后:
String result = getValueOrDefault(System.getProperty("XYZ"), "default");
此时,您不需要 temp
...您已经有效地使用方法参数作为初始化临时变量的方式。
如果您真的想要temp
并且您不想要额外的方法,您可以一次完成声明,但我真的不会:
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();
}
}
使用Java 8 Optional
(不需要过滤器):
public static String orElse(String defaultValue) {
return Optional.ofNullable(System.getProperty("property")).orElse(defaultValue);
}
使用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);
以上两个选项都会打印:
default
default
我知道这个问题真的很老了,但是使用泛型可以添加一种更通用的方法,适用于所有类型。
public static <T> T getValueOrDefault(T value, T defaultValue) {
return value == null ? defaultValue : value;
}
您可以在 org.apache.commons.lang3 库的 ObjectUtils
class 中使用此方法:
public static <T> T defaultIfNull(T object, T defaultValue)
如果使用JDK 9+,使用Objects.requireNonNullElse(T obj, T defaultObj)
对于番石榴,您可以使用
MoreObjects.firstNonNull(possiblyNullString, defaultValue);
恕我直言,这是最好的解决方案。它涵盖了 null
和 empty
场景,阅读代码时很容易理解。你需要知道的是 .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);
在 Java 9 中,如果你有一个对象有另一个对象 属性 并且嵌套对象有一个方法产生一个字符串,那么你可以使用这个结构来 return 如果嵌入对象为空,则为空字符串:
String label = Optional.ofNullable(org.getDiffusion()).map(Diffusion::getLabel).orElse("")
在这个例子中:
org
是类型Organism
对象的实例
Organism
有一个Diffusion
属性(另一个对象)Diffusion
有一个String label
属性(和getLabel()
getter)。
在此示例中,如果 org.getDiffusion()
不为空,则它 return 是其 Diffusion
对象的 getLabel
属性(此 returns 一个 String
)。否则,它 return 是一个空字符串。
如果您需要设置非空值或return默认值,您可以使用简单的通用方法
private <T> T getIfNotNullOrElse(T input, T data) {
return Optional.ofNullable(input).orElse(data);
}