仅在存在时打开可选项

yiw*_*wei 11 java optional java-8

所以目前我有

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 = "";
}
Run Code Online (Sandbox Code Playgroud)

我正在调用getDetailOfUri(uri)返回an 的方法,Optional<PageDetail>我想设置字符串displayName和对象字段description的值(PageDetail如果存在).否则,我想将其设置为某些默认值.

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

Tun*_*aki 15

你可以写:

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("");
Run Code Online (Sandbox Code Playgroud)

如果Optional未设置,map将返回相同的未设置Optional.否则,它会将其映射到Optional包含结果的getName().然后我们可以用来orElseOptional未设置时返回默认值.


pyb*_*pyb 8

使用带有供应商的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<PageDetail> emptySupplier = PageDetail::new;

pageDetail = pageDetail.orElseGet(emptySupplier);
// works the same
//pageDetail = pageDetail.orElseGet(() -> new PageDetail());

String displayname = pageDetail.getName();
String uri = pageDetail.getUri();
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:感谢大家的反馈!我实际上正在添加orElseGet我发现更好.我还修复了代码以解开Optional这样的pageDetail结尾是一个实际的PageDetail实例.

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

  • 不,这是错误的,因为你需要调用`getName()`来获取显示名称. (2认同)
  • @leoger OP需要`displayName = pageDetail.get().getName();`.这段代码甚至不会编译,因为它将`PageDetail`类型赋给`String` (2认同)