仅在存在时打开可选项

所以目前我有

String uri = website.getUri(); Optional 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 ,我想将字符串displayNamedescription设置为PageDetail对象字段的值(如果存在)。 否则,我想将其设置为某些默认值。

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

你可以写:

 String uri = website.getUri(); Optional pageDetail = webClient.getDetailOfUri(uri); String displayName = pageDetail.map(PageDetail::getName).orElse(uri); String description = pageDetail.map(PageDetail::getDescription).orElse(""); 

如果未设置Optional ,则map将返回相同的unset Optional 。 否则,它会将其映射到包含getName()结果的Optional 。 然后,当取消设置Optional时,我们可以使用orElse返回默认值。

使用带有供应商的 Optional#orElseGet :

 // 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 emptySupplier = PageDetail::new; pageDetail = pageDetail.orElseGet(emptySupplier); // works the same //pageDetail = pageDetail.orElseGet(() -> new PageDetail()); String displayname = pageDetail.getName(); String uri = pageDetail.getUri(); 

仅当Optional具有空值时, orElseGet才会创建空的PageDetail。 这可以保持代码资源的有效性。

可编辑/可编辑的样本: https : //ideone.com/9h1Ntg

编辑:感谢大家的反馈! 我实际上是在添加orElseGet ,我发现它更好。 我还修改了代码以解包Optional因此pageDetail结束是一个实际的PageDetail实例。

编辑2:添加了不同的语法示例和可编辑/可编译示例。