Java - Check Not Null/Empty else指定默认值

Cam*_*989 37 java inline ternary

我正在尝试简化以下代码.

代码应执行的基本步骤如下:

  1. 为String分配默认值
  2. 运行方法
  3. 如果该方法返回null/empty字符串,则将String保留为默认值
  4. 如果方法返回有效字符串,则将String设置为此结果

一个简单的例子是:

    String temp = System.getProperty("XYZ");
    String result = "default";
    if(temp != null && !temp.isEmpty()){
        result = temp;
    }
Run Code Online (Sandbox Code Playgroud)

我使用三元运算符进行了另一次尝试:

    String temp;
    String result = isNotNullOrEmpty(temp = System.getProperty("XYZ")) ? temp : "default";
Run Code Online (Sandbox Code Playgroud)

isNotNullOrEmpty()方法

 private static boolean isNotNullOrEmpty(String str){
    return (str != null && !str.isEmpty());
}
Run Code Online (Sandbox Code Playgroud)

是否可以在线完成所有这些操作?我知道我可以这样做:

String result = isNotNullOrEmpty(System.getProperty("XYZ")) ? System.getProperty("XYZ") : "default";
Run Code Online (Sandbox Code Playgroud)

但我两次调用相同的方法.我会喜欢做这样的事情(这不起作用):

String result = isNotNullOrEmpty(String temp = System.getProperty("XYZ")) ? temp : "default";
Run Code Online (Sandbox Code Playgroud)

我想在同一行中初始化'temp'字符串.这可能吗?或者我该怎么办?

谢谢你的建议.

蒂姆

nob*_*beh 51

使用Java 8 Optional(不需要过滤器):

public static String orElse(String defaultValue) {
  return Optional.ofNullable(System.getProperty("property")).orElse(defaultValue);
}
Run Code Online (Sandbox Code Playgroud)

  • 哇!相比swift的`s = q ?? r`. (13认同)
  • @RyanBurbidge,原因是:您不必要在简单方法中创建一个对象(可选对象)。 (8认同)
  • @Q8i当然,如果您使操作变得不必要的复杂,您希望将其最大化。否则,您可以简单地使用 System.getProperty("property", defaultValue)` 来完成这项工作,而无需额外的语法结构。 (4认同)
  • 不应在方法内为流程控制创建可选项。构建Optional的开发人员将此称为反模式。https://www.youtube.com/watch?amp=&v=Ej0sss6cq14 (2认同)

AK4*_*647 50

如果使用 JDK 9 +,请使用 Objects.requireNonNullElse(T obj, T defaultObj)


zal*_*lis 31

使用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);
Run Code Online (Sandbox Code Playgroud)

以上两个选项都将打印:

默认

默认

  • 如果字符串为空或空白(例如仅包含空格),还有 `StringUtils.defaultIfBlank` 来提供默认值:`result = StringUtils.defaultIfBlank(emptyString, "default");`。 (3认同)

Shi*_*his 29

我知道问题确实很旧,但是对于泛型,我可以添加一个更通用的方法,它适用于所有类型.

public static <T> T getValueOrDefault(T value, T defaultValue) {
    return value == null ? defaultValue : value;
}
Run Code Online (Sandbox Code Playgroud)

  • @ Cam1989:这不回答你问的问题,因为它不处理空字符串...它只处理值为"null"的值,而不是空的......如果那是你想要的,那就是你应该问.这是解决不同问题的完美解决方案,但它*是解决不同问题的解决方案...... (3认同)
  • @brunch875从Java 9开始,此功能作为标准API方法存在:[`Objects.requireNonNullElse(T obj, T defaultObj)`](https://docs.oracle.com/en/java/javase/16/docs/api /java.base/java/util/Objects.html#requireNonNullElse(T,T)),包括延迟构造后备的变体,[`Objects.requireNonNullElseGet(T obj, Supply&lt;? extends T&gt; seller)`] (https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/util/Objects.html#requireNonNullElseGet(T,java.util.function.Supplier))。 (2认同)

Tar*_*rik 14

您可以在org.apache.commons.lang3库的ObjectUtils类中使用此方法:

public static <T> T defaultIfNull(T object, T defaultValue)
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 12

听起来你可能想要这样一个简单的方法:

public String getValueOrDefault(String value, String defaultValue) {
    return isNotNullOrEmpty(value) ? value : defaultValue;
}
Run Code Online (Sandbox Code Playgroud)

然后:

String result = getValueOrDefault(System.getProperty("XYZ"), "default");
Run Code Online (Sandbox Code Playgroud)

此时,您不需要 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();
    }
}
Run Code Online (Sandbox Code Playgroud)