java - Null-Check & isPresent - 名称不同但问题相同?
问题描述
我在Java中有以下代码:
public class Browser {
public URL back() {
try {
//simulate: fetch last URL from Stack
return Math.random() < 0.5 ? new URL("http://google.de") : null;
} catch(MalformedURLException e) {
return null;
}
}
public void retrieveSite(URL url) {
System.out.println(url);
//...
}
public static void main(String[] args) {
System.out.println("Normal back");
Browser browser = new Browser();
URL back = browser.back();
if (back != null) browser.retrieveSite(back);
}
}
我想了解更多Optional
并重新编写此代码,以便return null
不再if (back!=null)
需要。
所以这就是我得到的:
public class Browser {
Optional<URL> url = Optional.empty();
public Optional<URL> back() {
try {
//simulate: fetch last URL from Stack
if(Math.random()<0.5) {
url = Optional.of(new URL("http://google.de"));
}
return url;
} catch(MalformedURLException e) {
return url;
}
}
public void retrieveSite(Optional<URL> url) {
System.out.println(url);
//...
}
public static void main(String[] args) {
System.out.println("Normal back");
Browser browser = new Browser();
Optional<URL> back = browser.back();
if(back.isPresent()) {
browser.retrieveSite(back);
}
}
}
现在为了避免将空传递Optional
给retrieveSite
,我必须检查当前值。但是我从检查isPresent
而不是仅仅获得了!=null
什么?我应该返回一个default
值,所以我可以摆脱isPresent
吗?
我还必须更改参数retrieveSite()
以采用Optional
被认为是不好的做法?
提前致谢。
解决方案
您的第二种方法的稍微不同的变体可以以更清洁的方式实现,例如:
static class Browser {
// good practice to return Optional instead of a null
Optional<URL> back() {
try {
//simulate: fetch last URL from Stack
return Math.random() < 0.5 ? Optional.of(new URL("http://google.de")) : Optional.empty();
} catch (MalformedURLException e) {
return Optional.empty();
}
}
// avoid using Optional as a parameter to a method
static void retrieveSite(URL url) {
System.out.println(url);
}
public static void main(String[] args) {
System.out.println("Normal back");
Browser browser = new Browser();
// perform a void operation if the URL is present (consuming it)
browser.back().ifPresent(Browser::retrieveSite);
}
}
推荐阅读
- javascript - 如何将 JavaScript 变量作为属性存储在对象内部
- css - 没有伪元素的 div 动画
- java - Fxml 需要获得与它所在的 fxml 相同的控制器
- wpf - PowerShell 在事件中更新 WPF 窗口
- android - 如何知道回收站视图在 23 版之前的 api 中是向上还是向下滚动
- javascript - 删除引用的 JS 对象中的属性
- python - 熊猫从两个不同形状的数据框中确定交点
- c++ - 指向具有 decltype 的函数的指针向量
- javascript - 有没有办法在 Closure 编译器中启用死代码消除而不重命名?
- javascript - 在 Cache API 中,使用 caches.match(event.request) 和 caches.match(event.request.url) 有什么区别