Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-检查NOTNULL/Empty else分配默认值_Java_Inline_Ternary - Fatal编程技术网

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

我试图简化以下代码

准则应执行的基本步骤如下:

  • 为字符串指定默认值
  • 运行一个方法
  • 如果该方法返回null/空字符串,则将该字符串保留为默认值
  • 如果该方法返回有效字符串,则将该字符串设置为该结果
  • 一个简单的例子是:

        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
      属性(和
      getLabel()
      getter)

    在本例中,如果
    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("")