java – 可选的`orElse`懒惰评估失败导致性能损失
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 可选的`orElse`懒惰评估失败导致性能损失,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2214字,纯文字阅读大概需要4分钟。
内容图文
考虑具有用户首选项系统的应用程序的以下用例:
我们想获得偏好MyFlag的bool值.
在最好的情况下,我们希望它来自当前用户的设置.
如果失败,我们希望从默认设置中获取MyFlag.
即使失败,也要扔掉.
设置在服务器上.此连接速度很慢,可能会失败.
获取设置并获得偏好也都会失败.
所以让我们使用javas Optionals:
public static boolean getMyFlag()throws NoSuchElementException
{
return getUserOrDefaultPreference("MY_FLAG");
}
private Boolean getUserOrDefaultPreference(String preferenceName) throws NoSuchElementException
{
return Optional.ofNullable(getConnection()) // get slow connection
.map(connection -> connection.getUserSettings()) // get user settings
.map(settings -> settings.getPref(preferenceName)) // return preference
.orElse(slowlyGetDefaultPreference(preferenceName)); // or else return default value
}
private Boolean slowlyGetDefaultPreference(String preferenceName) throws NoSuchElementException
{
return Optional.ofNullable(getConnection()) // get slow connection
.map(connection -> connection.getDefaultSettings()) // get default settings
.map(settings -> settings.getPref(preferenceName)) // return preference
.orElseThrow(() -> new NoSuchElementException()); // if any of the above fails throw
}
这里的问题是连接速度很慢.当.orElse(慢慢地……);被称为func slowGetDefaultPreference()首先被评估,无论我的可选项是空的还是有值.这是性能损失,我必须避免.
我尝试通过.orElseGet(() – > slowlytGet ..)使用供应商,但这导致了同样的问题.
所以我唯一的办法就是丑陋的isPresent()反模式,从可读性的角度来看,它破坏了整个可选流程:
private Boolean getUserOrDefaultPreference(String preferenceName) throws NoSuchElementException
{
Optional<Boolean> opt = Optional.ofNullable(getConnection())
.map(connection -> connection.getUserSettings())
.map(settings -> settings.getPref(preferenceName));
if(opt.isPresent())
{
return opt.get();
}
else
{
slowlyGetDefaultPreference(preferenceName));
}
}
抛出异常同样适用,因为我不想支付构建异常的费用.
我在这里遗漏了什么或这是唯一的解决方案吗?
解决方法:
当我测试它时它只打印“智能”:
public class SampleJava {
public static String stupid() {
System.out.println("stupid");
return "stupid";
}
public static void main(String[] args) {
System.out.println(Optional.ofNullable("smart").orElseGet(() -> stupid()));
}
}
内容总结
以上是互联网集市为您收集整理的java – 可选的`orElse`懒惰评估失败导致性能损失全部内容,希望文章能够帮你解决java – 可选的`orElse`懒惰评估失败导致性能损失所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。