仅在存在时打开可选项

时间:2015-08-28 18:21:15

标签: java java-8 optional

所以目前我有

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>,我想将字符串displayNamedescription设置为{{1}的值对象的字段,如果存在的话。否则,我想将其设置为某些默认值。

我的问题是,有没有更好的方法来重写这个?我目前的代码似乎有点冗长乏味,我想知道是否有更简洁的方法来做到这一点。

2 个答案:

答案 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#orElseGetSupplier

// 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 :添加了不同的语法示例和可编辑/可编辑的示例。