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。