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

时间:2015-05-07 08:25:29

标签: java lambda java-8 optional

我想对于返回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
}

因此该功能如下:

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

现在我想做一些事情,如果列表存在,例如:

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

int size = 0;

listOfSomething.ifPresent(size = listOfSomething.get().size());

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

  

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

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

3 个答案:

答案 0 :(得分:16)

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

size = listOfSomething.map(List::size).orElse(0);

但返回空List代替Optional会好得多。

答案 1 :(得分:16)

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

您的方法可以返回List或“no list”。

如果它返回一个List,它可能会返回一个空列表。

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

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

答案 2 :(得分:4)

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

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

但是as stated by Tagir Valeev最好这样做:

size = listOfSomething.map(List::size).orElse(0);

最好还是返回一个空List或者甚至是一个Stream。