所以目前我有
String uri = website.getUri();
Optional<PageDetail> pageDetail = webClient.getDetailOfUri(uri);
String displayName;
String description;
if (pageDetail.isPresent()) {
displayName = pageDetail.get().getName();
description = pageDetail.get().getDescription();
} else {
displayName = uri;
description = "";
}
我正在调用getDetailOfUri(uri)
方法,该方法返回Optional<PageDetail>
,我想将字符串displayName
和description
设置为{{1}的值对象的字段,如果存在的话。否则,我想将其设置为某些默认值。
我的问题是,有没有更好的方法来重写这个?我目前的代码似乎有点冗长乏味,我想知道是否有更简洁的方法来做到这一点。
答案 0 :(得分:14)
你可以写:
String uri = website.getUri();
Optional<PageDetail> pageDetail = webClient.getDetailOfUri(uri);
String displayName = pageDetail.map(PageDetail::getName).orElse(uri);
String description = pageDetail.map(PageDetail::getDescription).orElse("");
如果未设置Optional
,则map
将返回相同的未设置Optional
。否则,它会将其映射到包含Optional
结果的getName()
。然后,我们可以使用orElse
在未设置Optional
时返回默认值。
答案 1 :(得分:8)
使用Optional#orElseGet的Supplier:
// Reference to the constructor, but you could use a Factory, etc.
// All you need is a method that returns a PageDetail
// See the Javadoc and http://www.byteslounge.com/tutorials/java-8-consumer-and-supplier
Supplier<PageDetail> emptySupplier = PageDetail::new;
pageDetail = pageDetail.orElseGet(emptySupplier);
// works the same
//pageDetail = pageDetail.orElseGet(() -> new PageDetail());
String displayname = pageDetail.getName();
String uri = pageDetail.getUri();
仅当Optional的值为null时, orElseGet
才会创建一个空的PageDetail。这可以保持代码资源的有效性。
可编辑/可编辑样本:https://ideone.com/9h1Ntg
编辑:感谢大家的反馈!我实际上正在添加orElseGet
我觉得更好。我还修复了代码以解开Optional
,因此pageDetail
结尾是实际的PageDetail
实例。
编辑2 :添加了不同的语法示例和可编辑/可编辑的示例。