当前位置: 首页 > 知识库问答 >
问题:

Java可选可用于流量控制吗?

沈华晖
2023-03-14

我找不到使用Java的可选功能执行以下操作的方法:

if (SOME_OBJECT != null) {
  doSomething(SOME_OBJECT);
} else {
  doSomethingElse();
}

通过使用可选,我的意思不是用可选替换某个对象==null。ofNullable(SOME\u对象)。isPresent(),它的语法比简单地检查是否为null要长得多。

我所期望的是:

Optional.ofNullable(SOME_OBJECT)
  .ifPresent(this::doSomething)
  .orElse(this::doSomethingElse);

我找不到像我刚刚写的那样的API。它存在吗?如果存在,它是什么?如果没有,为什么没有?:)

第二段代码看起来像反模式:(为什么?也许Java的架构师故意阻止了这种语法...


共有3个答案

段干兴业
2023-03-14

如前所述,Java 8没有一个构造来完全实现您想要的功能。

我知道,这很难看,比简单的if/then/else可读性差得多,但你可以这样做:

Optional.ofNullable(someObject)
        .map(obj -> {
            System.out.println("present");
            return obj;
          })
        .orElseGet(() -> {
            System.out.println("not present");
            return null;
          });

唯一的副作用是你总是退回一些东西
或者另一方面,您可以干净地处理案例isPresent()

Optional.ofNullable(someObject).ifPresent(obj -> {
  System.out.println("present");
});
墨高杰
2023-03-14

正如BdoubleB97(Bdubzz)所述,Java 9将实现可选的ifPresentOrElse,这将需要消费者

您可以立即更新到Java 9早期访问构建,也可以使用以下内容自行构建该方法:

public <T> void ifPresentOrElse(Optional<T> optional, Consumer<? super T> action, Runnable emptyAction) {
    if (optional.isPresent()) {
        action.accept(optional.get());
    } else {
        emptyAction.run();
    }
}
陶朝明
2023-03-14

正如在这篇博客文章中提到的,Optionals将在Java 9中获得一个新方法:void ifPresentOrElse(消费者

 类似资料:
  • 使用Java8已经有6个多月了,我对新的API变化非常满意。我仍然不确定的一个方面是何时使用。我似乎在想要在任何地方都使用它(有些东西可能是)和根本不在任何地方)之间摇摆。 当我可以使用它时,似乎有很多情况,但我从来不确定它是增加了好处(可读性/空安全性)还是仅仅导致了额外的开销。 因此,我有几个例子,我想了解社区对是否有益的看法。 1-当方法可以返回时,作为公共方法返回类型: 2-当参数可能为时

  • 目录 概述 基于 QPS/并发数的流量控制 基于调用关系的流量控制 概述 流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。 FlowSlot 会根据预设的规则,结合前面 NodeSelectorSlot、ClusterBuilderSlot、StatisticSlot 统

  • 问题内容: Java Sound提供了各种声音线功能以及&控件类型的实例。 可以使用这些控件来更改系统音量吗? 问题答案: 不,它不能。这是从“ 调整码位上的主音量”的答案改编而来的资源。源代码会迭代可用的行,检查它们是否具有正确类型的控件,如果有,则将它们放入连接到命令行的GUI中。 在这台Windows 7计算机上,我有两个控件,都来自“ Java Sound Audio Engine”。都不

  • 1 背景 在系统访问量较大时,某些库的负载可能非常高,或者因为临时故障或系统bug导致大量异常SQL打到某个库上。为了防止数据库被这些异常流量打垮,需要在数据库访问层上对MySQL进行保护,因此zebra需要提供对某些特定SQL或某个库进行限流的功能。(SQL限流只是用于临时解决问题,事后还需业务方进行优化或扩容) 2 目标 动态限流,可动态配置限流策略与流量大小 支持限制某个数据源上的某些特定的

  • 我在学习编程,我在研究Java中的流。我写了一个方法,可以从医生和病人名单中找出最高的人体物体。 该方法本身也可以工作。我刚刚注意到,每当我试图打印出choosen对象(最高的人)的toString()方法时,控制台上都有一个“可选[…]”标记。 控制台-输出: 最高的病人:可选的【彼得是一个有私人保险的美国人,大约220厘米高。] IDE告诉我,那是因为如果是空列表,元素可能为零。试图通过考虑N

  • 缺省情况下,启用了Istio的服务是无法访问外部URL的,这是因为Pod中的iptables把所有外发传输都转向到了Sidecar代理,而这一代理只处理集群内的访问目标。 本节内容会描述如何把外部服务提供给启用了Istio的客户端服务使用,你会学到如何使用Egress规则访问外部服务,或者如何简单的让特定IP范围穿透Istio代理。 开始之前 遵循安装指南设置Istio 启动sleep示例,用于测