在Java 8中使用Optional参数调用方法

Ary*_*rya 0 java

我有以下方法

public static Boolean test(String str, Optional<Boolean> test) {


}
Run Code Online (Sandbox Code Playgroud)

但如果我试着称之为

test("hello")
Run Code Online (Sandbox Code Playgroud)

我得到一个错误,该方法需要两个参数.

不应该让Optional参数调用测试方法而不提供Optional参数吗?

dav*_*xxx 7

Optional不是可选参数var-args.
Optional是一个容器对象,可能包含也可能不包含非null值.

所以你可以调用方法:

test("...", Optional.of(true));
Run Code Online (Sandbox Code Playgroud)

要么

test("...", Optional.empty());
Run Code Online (Sandbox Code Playgroud)

请注意var-args:

public static Boolean test(String str, Boolean... test) {    
 //...
}
Run Code Online (Sandbox Code Playgroud)

这是有效的:

test("hello")
Run Code Online (Sandbox Code Playgroud)

但var-args 不是传递可选参数的正确方法,因为它传递0个或更多个对象而不是0或1个对象.

方法重载更好:

public static Boolean test(String str, Boolean test) {
 // ...
}

public static Boolean test(String str) {
 // ...
}
Run Code Online (Sandbox Code Playgroud)

在其他一些情况下,@Nullable约束(JSR-380)也可能很有趣.

  • 我不会将varargs与可选参数等同起来.如果您不想传递参数,那么在此处执行的适当操作是定义重载. (2认同)