Java 8 当方法的参数可以为null时,是否应该使用java可选?

Java 8 当方法的参数可以为null时,是否应该使用java可选?,java-8,optional,Java 8,Optional,如果在Java8中有这样一个方法,那么将参数包装成可选的格式是否正确?当参数可以为空时,最佳做法是什么? 值得一提的是,参数“c”来自一个我不能从那里改为可选的源 public String isSomething(c) { if(c != null) { return ("something".equals(c))? "YES" : "NO"; } return null; } 你可以写: public String isSome

如果在Java8中有这样一个方法,那么将参数包装成可选的格式是否正确?当参数可以为空时,最佳做法是什么? 值得一提的是,参数“c”来自一个我不能从那里改为可选的源

public String isSomething(c) {  
    if(c != null) {
        return ("something".equals(c))? "YES" : "NO";
    }

    return null;        
}
你可以写:

public String isSomething(String c) {
    return Optional.ofNullable(c)
            .map(x -> "something".equals(x) ? "YES" : "NO")
            .orElse(null);
}
但无论您有什么(稍加修改)都可能更具可读性:

public String isSomething(String c) {
    if (c == null) {
        return c;
    }

    return "something".equals(c) ? "YES" : "NO";

}

最佳实践是不要声明“参数可以为null”,而实际上,当参数为
null
时,该方法没有做任何有用的事情

您的代码是反模式的完美示例。如果参数为
null
,则您的方法返回
null
,以使调用方的代码在以后某个时间失败,在最坏的情况下,无法追溯到
null
引用第一次出现的位置

如果您的方法对
null
没有做任何有用的事情,那么它不应该假装这样做,而是应该实现一种快速故障行为,使调用方能够发现尽可能接近原始原因的错误:

public String isSomething(String c) {  
    return c.equals("something")? "YES": "NO";// yes, that ought to fail if c is null
}
如果调用者知道
可选值并积极使用,则无需您提供特殊支持:

Optional<String> o = …;
o = o.map(s -> isSomething(s));
// now o encapsulates "YES", "NO", or is empty
在这里,读者完全可以清楚地看到,可以省略参数,而不必处理
null
Optional

如果要支持多个可选参数,请查看生成器模式。

可能重复的
System.out.println("foo"); // prints foo and a newline

System.out.println(); // just prints a newline