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().然后我们可以用来orElse在Optional未设置时返回默认值.
// 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:添加了不同的语法示例和可编辑/可编译的示例.
| 归档时间: |
|
| 查看次数: |
4739 次 |
| 最近记录: |