Unwrap an Optional only if it is present

白昼怎懂夜的黑 提交于 2019-12-04 18:07:18

问题


So currently I have

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 = "";
}

I am calling the getDetailOfUri(uri) method, which returns an Optional<PageDetail>, and I would like to set the strings displayName and description to the values of the PageDetail object's fields, if it is present. Otherwise, I would like to set it to some default values.

My question is, is there a better way to rewrite this? My current code seems a bit long and tedious, and I would like to know if there is a more concise way of doing this.


回答1:


You could write:

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("");

If the Optional is not set, map will return the same unset Optional. Otherwise, it will map it to an Optional containing the result of getName(). Then we can use orElse to return a default value when the Optional is unset.




回答2:


Use Optional#orElseGet that takes a 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();

orElseGet will create an empty PageDetail only if the Optional has a null value. This keeps your code resource efficient.

Editable/compilable sample : https://ideone.com/9h1Ntg

Edit: Thanks everybody for the feedback! I was actually adding orElseGet which I find better. I also fixed the code to unwrap the Optional so pageDetail ends being an actual PageDetail instance.

Edit 2: Added different syntax example and editable/compilable example.



来源:https://stackoverflow.com/questions/32277465/unwrap-an-optional-only-if-it-is-present

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!