空安全方法链接,可选
番石榴的模式很棒,因为它有助于消除空的歧义。当链的第一部分可能不存在时,该方法对于创建空安全的方法链非常有用,但是当链的其他部分不存在时,此方法没有用处。Optional
transform
这个问题与Guava Optional类型有关,当转换返回另一个Optant时,它问的问题基本上是相同的,但对于不同的用例,我认为可能不是预期的用途(处理错误)。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 中。(for ) 的实现可能为: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