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

Java8可选激发一个方法(如果为null),另一个(如果不为null)最佳方法

欧阳杰
2023-03-14
changeA(){
..
}

changeB(){
..
}

aMethod(){
    Optional<String> optA=Optional.ofNullable(a);
    Result result = optA.map( aStr -> this.changeA( aStr ) ).orElse( this.changeB( bStr ) );
}

这看起来有点奇怪,因为orElse方法使用的变量不在lambda的范围内。我能知道最好的方法吗?

也许我应该说说为什么我选择了可选的。我希望我的团队的开发人员明白,即使字符串A是首选的,它可能是空的,并且必须处理,因为代码的这一部分是敏感的。字符串B仅用于记录的遗留部分。希望这能澄清我对这种方法的意图。

共有1个答案

衡修洁
2023-03-14

若要仅在必要时调用changeB,可以使用以下构造:

result = Optional.ofNullable(aStr).map(this::changeA).orElseGet(
          () -> Optional.ofNullable(bStr).map(this::changeB).orElse(null));

请注意,您可以在完全不使用选项的情况下执行此操作:

result = aStr != null ? changeA(aStr) :
         bStr != null ? changeB(bStr) :
         null;

这要短得多,生成的字节码也更清晰。

Supplier<Result> aSupplier = () -> aStr == null ? null : changeA(aStr);
Supplier<Result> bSupplier = () -> bStr == null ? null : changeB(bStr);

result = Stream.of(aSupplier, bSupplier).map(Supplier::get)
               .filter(Objects::nonNull).findFirst().orElse(null);
 类似资料:
  • 问题内容: 是否可以将此代码转换为Java 8可选单行表达式? 即如果某个对象不为空,我需要调用一个对象方法并返回其结果,否则返回0。 不适合,因为它返回相同类型的对象,但是我需要方法调用的结果或一些默认值。 问题答案: 几种形式: 其中,最后一个不使用Optional(因此不能严格回答您的问题!)更易于阅读,运行时开销也较小,因此应优先使用。 可以说,如果您反转选项,它甚至更简单: …尽管您可能

  • 是否可以将此代码转换为Java8可选的单行表达式? i、 如果某个对象不是null,我需要调用一个对象方法并返回其结果,否则返回0<代码>可选。不可数()。orElse()不适合,因为它返回相同类型的对象,但我需要方法调用的结果或一些默认值。

  • 问题内容: 我想知道是否有办法强制唯一的收集条目, 但前提是条目不为null 。e示例架构: 在这种情况下,不需要’email’,但是如果保存了’email’,我想确保该条目是唯一的(在数据库级别)。 空条目的值似乎为’null’,因此每个条目都不会通过’unique’选项使电子邮件崩溃(如果有其他用户没有电子邮件)。 现在,我正在应用程序级别解决它,但希望保存该数据库查询。 谢谢 问题答案: 从

  • 所以我有了这个数据表 正如您所看到的,如果值为null,则获取前一个值,但是如果您查看第三行,我将获得一个null,我假设是因为它获取了第二行的值,但是当它仍然没有更新时(因此仍然是来自原始dataframe的null)。 我有点不知道该怎么做。有人帮忙吗?

  • 问题内容: 好的,我有一个有关处理null的问题。这个问题可能主要基于观点,因此我要问一下优缺点。 假设我有一个可以返回null或JSONArray的函数。我一直想要一个JSONArray,因此如果函数的结果为null,我希望它创建一个空的JSONArray。 目前,我有以下方法: 我喜欢这种方法,因为它只是一行,而且很清楚它的作用。但这确实引出我一个问题,这有效吗?我有一个想法,现在它可以在不需

  • 我在创造一个小游戏。所以现在我有了一个只有5行的JTable。 单击按钮后,我希望保存表中的值。我的问题是,最后一个值每次都为null。 例 Val来自表:user1,user2,user3,user4,user5 预期输出:[user1,user2,user3,user4,user5] 输出:[user1,user2,user3,user4,null] 这就是我从表中获取数据的方式 可运行示例