【发布时间】:2013-05-27 20:21:02
【问题描述】:
Guava 的Optional 模式很棒,因为它有助于消除 null 的歧义。当链的第一部分可能不存在时,transform 方法对于创建空安全方法链非常有帮助,但在链的其他部分不存在时则无用。
这个问题与Guava Optional type, when transformation returns another 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 团队的来信,或者被指向与该问题相关的讨论(我在搜索中没有找到任何内容)。
【问题讨论】:
-
你试过discussion group吗?考虑在那里发帖,即使只是为了指出这个(写得很好的)问题。