使用 Java 8 可选字符串列表作为输出

2022-09-02 05:05:39

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


答案 1

在这里考虑语义很重要。

您的方法可以返回 List 或“无列表”。

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

你应该问,“是否有语义上的原因来区分空列表和无列表?有时有一个很好的设计理由来做出改变,但这是罕见的。在确定空和空在你的案例中是不同的之前,请仔细考虑。避免“无列表”的部分原因是它减少了客户端代码必须考虑的“特殊情况”。例如,如果他们必须对返回的每个项目执行某些操作,但您也可以返回 null,则必须在进入 for 每个循环之前对 null 执行特殊检查。如果列表为空,则每个的 A 不执行任何操作。

如果问题域中的“无列表”与“空列表”不同,则有时返回包装类以帮助客户端代码区分这些条件并正确处理它们非常有用。 就是这样一个泛型类,但是您的域可能会调用更具体的内容(即使它模仿了 Optional 的功能,它也可能具有更好的语义定义)。Optional


答案 2

真正的函数式编程方式如下:

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

但是最好返回空的而不是 。ListOptional


推荐