Guava的Optional模式非常好,因为它有助于消除null的歧义。当链的第一部分可能不存在但其他部分不存在时,transform方法非常有用,但在其他部分不存在时并不实用。
这个问题涉及到Guava Optional类型,当转换返回另一个Optional,它基本上问的是同样的问题,但是用例不同,我认为这可能不是Optional的预期使用(处理错误)。
考虑一个方法
在中间方法可能返回
在
"
如果有一种处理返回
我想知道是否还有其他人遇到过这个问题,并找到了好的解决方案(不涉及编写自己的
这个问题涉及到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>>
。在
Optional
上似乎有一个类似于transform()
的方法,它将接受一个返回Optional
的函数。它的行为与当前实现完全相同,只是它不会在函数的结果中包装一个Optional。对于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团队的意见,或者指向与此问题相关的讨论(在我的搜索中没有找到)。