使用Java 8 Optional for String of List作为输出

Sco*_*ion 9 java lambda optional java-8

我想对返回List的方法使用Optional

让我们说功能是

public Output getListOfSomething() {
    // In some cases there is nothing to return and hence it makes sense to have return 
    // type as Optional here
}
Run Code Online (Sandbox Code Playgroud)

因此该函数看起来像:

public Optional<List<String>> getListOfSomething() {
    // return something only when there is some valid list
}
Run Code Online (Sandbox Code Playgroud)

现在我想要做一些事情,如果列表存在,如下所示:

Optional<List<String>> listOfSomething = getListOfSomething();

int size = 0;

listOfSomething.ifPresent(size = listOfSomething.get().size());
Run Code Online (Sandbox Code Playgroud)

我是Optional的新手,已经阅读了有关Optional的文章,看起来这应该可行但是我的IDE中出现语法错误:

方法ifPresent不适用于参数(void).

我想从开发人员那里获得一些帮助,他们可能会更熟练地使用java 8中的lamdas.

Dan*_*iel 20

在这里考虑语义学很重要.

您的方法可以返回List或"无列表".

如果它返回一个List,它可以返回一个Empty列表.

你应该问,"是否存在区分空列表和无列表的语义原因?" 有时候有一个很好的设计理由可以发挥作用,但这种情况很少见.在判断Empty和Null在您的情况下是不同的之前,请仔细考虑.避免No List的部分原因是它减少了客户端代码必须考虑的"特殊情况".例如,如果他们必须为返回的每个项执行某些操作,但您也可以返回null,则必须在进入每个循环之前对null进行特殊检查.如果列表为空,则每个A都不执行任何操作.

如果"无列表"与问题域中的"空列表"不同,那么返回包装类有助于客户端代码区分这些条件并适当地处理它们.Optional是一个这样的泛型类,但您的域可能需要更具体的东西(即使它模仿Optional的功能,它可能有更好的语义定义).


Tag*_*eev 17

真正的功能编程方式如下:

size = listOfSomething.map(List::size).orElse(0);
Run Code Online (Sandbox Code Playgroud)

但是返回空List而不是返回会更好Optional.


小智 5

ifPresent需要使用Consumer接口才能工作。您可以执行以下操作:

Optional<List<String>> listOfSomething = getListOfSomething();
Integer[] size = {0};
listOfSomething.ifPresent(list -> size[0]=list.size())
Run Code Online (Sandbox Code Playgroud)

但是正如Tagir Valeev所说,这样做会更好:

size = listOfSomething.map(List::size).orElse(0);
Run Code Online (Sandbox Code Playgroud)

而且最好返回一个空的List甚至一个Stream。