Java-检查NOTNULL/Empty else分配默认值
我试图简化以下代码 准则应执行的基本步骤如下:Java-检查NOTNULL/Empty else分配默认值,java,inline,ternary,Java,Inline,Ternary,我试图简化以下代码 准则应执行的基本步骤如下: 为字符串指定默认值 运行一个方法 如果该方法返回null/空字符串,则将该字符串保留为默认值 如果该方法返回有效字符串,则将该字符串设置为该结果 一个简单的例子是: String temp = System.getProperty("XYZ"); String result = "default"; if(temp != null && !temp.isEmpty()){ result = t
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()方法
所有这些都可以在线完成吗?我知道我可以这样做:
String result = isNotNullOrEmpty(System.getProperty("XYZ")) ? System.getProperty("XYZ") : "default";
public String getValueOrDefault(String value, String defaultValue) {
return isNotNullOrEmpty(value) ? value : defaultValue;
}
但我两次调用相同的方法。我想做这样的事情(这不起作用):
我想在同一行中初始化“temp”字符串。这可能吗?或者我该怎么做
谢谢你的建议
Tim听起来你可能想要一个这样的简单方法:
String result = isNotNullOrEmpty(System.getProperty("XYZ")) ? System.getProperty("XYZ") : "default";
public String getValueOrDefault(String value, String defaultValue) {
return isNotNullOrEmpty(value) ? value : defaultValue;
}
然后:
此时,您不需要temp
。。。您已经有效地使用了method参数作为初始化临时变量的方法
如果您真的想要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(无需过滤器):
使用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);
上述两个选项都将打印:
违约
违约
我知道这个问题确实很老了,但是对于泛型,可以添加一个更通用的方法,它将适用于所有类型
public static <T> T getValueOrDefault(T value, T defaultValue) {
return value == null ? defaultValue : value;
}
公共静态T GetValuerDefault(T值,T默认值){
返回值==null?默认值:值;
}
您可以在库中的ObjectUtils
类中使用此方法:
public static <T> T defaultIfNull(T object, T defaultValue)
公共静态T defaultIfNull(T对象,T defaultValue)
如果使用JDK 9+,请使用Objects.requireNonNullElse(T obj,T defaultObj)可以使用番石榴
MoreObjects.firstNonNull(possiblyNullString, defaultValue);
这是IMHO的最佳解决方案。它涵盖了
null
和empty
场景,这在阅读代码时很容易理解。您需要知道的是,.getProperty
在未设置系统属性时返回一个null
:
String DEFAULT_XYZ = System.getProperty("user.home") + "/xyz";
String PROP = Optional.ofNullable(System.getProperty("XYZ"))
.filter(s -> !s.isEmpty())
.orElse(DEFAULT_XYZ);
在Java 9中,如果有一个对象具有另一个对象作为属性,并且嵌套对象具有生成字符串的方法,那么如果嵌入的对象为null,则可以使用此构造返回空字符串:
String label = Optional.ofNullable(org.getDiffusion()).map(Diffusion::getLabel).orElse("")
在本例中:
是类型为org
organic
具有生物体
属性(另一个对象)扩散
有一个Diffusion
属性(和String-label
getter)getLabel()
在本例中,如果
org.getDiffusion()
不为null,则返回其Diffusion
对象的getLabel
属性(这将返回一个字符串
)。否则,它将返回一个空字符串。@fge假定它不是System.getProperty()的情况,而是某个默认值没有此额外参数的方法。那个么这个把戏就行了,它是可伸缩的。我是怎么把它弄得这么复杂的!?非常感谢你!我使用了getValueOrDefault()方法。回答得好。哇!与swift的s=q??r
。不应为方法内的流控制创建选项。这被构建可选的开发人员称为反模式@RyanBurbidge,原因是:您在简单方法中不必要地创建了一个对象(可选对象)。@PAX,如果这是您可以通过使用Optional::orElseGet
来避免它的唯一原因的话。我个人更喜欢三元运算符,因为它同样懒惰和更短。@Q8i当然,如果你让一个操作变得不必要的复杂,你会想把它最大化。否则,只需使用System.getProperty(“property”,defaultValue)
即可完成任务,无需额外的语法构造。谢谢shibashis。我仍然使用这段代码,并且有很多对象类型的方法!我将尝试使用泛型来简化代码。感谢you@Cam1989:但这并不能回答您提出的问题,因为它不处理空字符串。。。它只处理null
值,而不是空值。。。如果那是你想要的,那就是你应该问的。这是对不同问题的完美解决方案,但它是对不同问题的解决方案…它将通过将“value==null”替换为“isNotNullOrEmpty(value)”并在三元响应中切换value和defaultValue来满足空要求小心!虽然三元运算符本身是惰性的,但这个解决方案不是!这意味着调用myThing=getValueOrDefault(thing,newthing())如果Thing
不为空,则code>将创建并丢弃该新事物()。您可能希望调整此函数以获取lambda,这样您可以改为执行getValueOrDefault(thing,thing::new)
。@brunch875自Java 9以来,此功能作为标准API方法存在:,包括一个具有延迟回退构造的变体。此操作检查null
,但不检查空字符串。最好使用StringUtils.defaultIfBlank
而不是使用great方法,最终我们得到了它。遗憾的是,它没有自动执行int
到long
转换。System.getProperty(“XYZ”,“default”)
String DEFAULT_XYZ = System.getProperty("user.home") + "/xyz";
String PROP = Optional.ofNullable(System.getProperty("XYZ"))
.filter(s -> !s.isEmpty())
.orElse(DEFAULT_XYZ);
String label = Optional.ofNullable(org.getDiffusion()).map(Diffusion::getLabel).orElse("")