java - 将 Java 8 Optional 用于字符串列表作为输出

标签 java lambda java-8 option-type

我想将 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 中出现语法错误:

method ifPresent is not applicable for the arguments (void).

我想从可能更熟练使用 Java 8 中的 lamda 的开发人员那里获得一些帮助。

最佳答案

在这里考虑语义很重要。

您的方法可以返回一个列表,或“无列表”。

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

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

如果您的问题域中的“无列表”与“空列表”不同,那么返回包装类有时会很有用,它可以帮助客户端代码区分这些情况,并适本地处理它们。 Optional 就是这样一个通用类,但您的领域可能需要更具体的东西(即使它模仿 Optional 的功能,它可能有更好的语义定义)。

关于java - 将 Java 8 Optional 用于字符串列表作为输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30095651/

相关文章:

java - 连接列表中所有 map 的字符串值

java - 使用 URL 对象读取 Web 内容中的资源

java - Java如何从/sys/fs/cgroup/读取零长度文件?

c# - 动态 Lambda 表达式构建器在枚举时崩溃

c# - 来自 Func<> 的异常未被捕获(异步)

Java 8 - 单词计数,然后按降序排列

java - 在java中使用StringBuilder的addFirst和addLast方法?

java - 使用 lambda 查找特定扩展名的文件

java - 如何在 mapstruct 中使用来自不同类的另一个映射

java - Mono 的 doOnSuccess 与 doOnNext 之间有区别吗?