Guava 的Optional
模式很棒,因为它有助于消除 null 的歧义。当链的第一部分可能不存在时,该transform
方法对于创建空安全方法链非常有帮助,但在链的其他部分不存在时则无用。
这个问题与Guava Optional 类型有关,当转换返回另一个 Optional 时,它提出了基本相同的问题,但针对不同的用例,我认为这可能不是Optional
(处理错误)的预期用途。
考虑一种方法Optional<Book> findBook(String id)
。findBook(id).transform(Book.getName)
按预期工作。如果没有找到书,我们得到一Absent<String>
本书,如果找到一本书,我们得到Present<String>
。
在中间方法可能返回null
/的常见情况下absent()
,似乎没有一种优雅的方式来链接调用。例如,假设Book
有一个方法Optional<Publisher> getPublisher()
,我们想获取一本书的出版商出版的所有书籍。自然语法似乎是findBook(id).transform(Book.getPublisher).transform(Publisher.getPublishedBooks)
,但这会失败,因为transform(Publisher.getPublishedBooks)
调用实际上会返回一个Optional<Optional<Publisher>>
.
有一个类似transform()
的方法Optional
来接受一个返回Optional
. 它的行为与当前实现完全相同,只是它不会将函数的结果包装在 Optional 中。实现 (for Present
) 可能是:
public abstract <V> Optional<V> optionalTransform(Function<? super T, Optional<V>> function) {
return function.apply(reference);
}
的实现Absent
与transform
:
public abstract <V> Optional<V> optionalTransform(Function<? super T, Optional<V>> function) {
checkNotNull(function);
return Optional.absent();
}
如果有一种方法来处理返回的方法null
而不是Optional
处理遗留对象,那也很好。这样的方法就像transform
只是简单地调用Optional.fromNullable
函数的结果。
我很好奇是否有其他人遇到过这种烦恼并找到了很好的解决方法(不涉及编写自己的Optional
课程)。我也很想听听 Guava 团队的消息或被指出与该问题相关的讨论(我在搜索中没有找到任何内容)。