如果一个可选的布尔值为真,如何执行操作?

21
在Java 8中,我有一个变量,它保存了一个可选的布尔值。
如果该可选项不为空,并且包含的布尔值为真,则我希望执行某个操作。
我想象中有一个类似于ifPresentAndTrue的东西,这里是一个完整的示例:
import java.util.Optional;

public class X {
  public static void main(String[] args) {
    Optional<Boolean> spouseIsMale = Optional.of(true);
    spouseIsMale.ifPresentAndTrue(b -> System.out.println("There is a male spouse."));
  }
}
6个回答

36

为了保持秩序

if (spouseIsMale.orElse(false)) {
    System.out.println("There is a male spouse.");
}

清晰明了。


2
虽然有可能放弃那些不必要的代码 "orElse(false)" 会更好。这就像写 "if (myBoolVariable == true)" - 我从来不写 "== true" ... 但是,尽管如此,我也使用这个精简、快速和易于理解的代码。 - BAERUS
@BAER 我也对 == true 这种写法过敏。看了一下 Java 9,但好像也没有更好的解决方案:spouseIsMale.stream().filter(Function::identity).forEach(b-> System.out.println("There is a male spouse.")); - Joop Eggen
1
你知道吗,你也可以过滤 Optional。 - shmosel
有没有一种方法可以在Java8中抛出异常,而不是使用else块来判断false? - Gibbs
@Gibbs https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html#orElseThrow-java.util.function.Supplier- - Joop Eggen
显示剩余2条评论

17

使用 .filter(b -> b) 可以实现这种行为:

spouseIsMale.filter(b -> b).ifPresent(b -> System.out.println("There is a male spouse."));

然而,理解这里正在发生的事情需要一些 脑执行时间 秒。


1
@JoopEggen filter(Functions.identity()) 不起作用,类型不兼容。 - slartidan
感谢,布尔值,不是Boolean。 - Joop Eggen

11

对于那些希望在不使用传统的if(condition){ //Do something if true; }语法的情况下编写代码的人来说

Optional.of(Boolean.True)
    .filter(Boolean::booleanValue)
        .map(bool -> { /*Do something if true;*/ })

4

综上所述:

spouseIsMale
.filter(Boolean::booleanValue)
.ifPresent(
  value -> System.out.println("There is a male spouse.")
);

0

我通常使用的是(我还会检查空值):

Optional.ofNullable(booleanValue).filter(p -> p).map(m -> callFunctionWhenTrue()).orElse(doSomethingWhenFalse());

这个有三个部分:

  1. Optional.ofNullable(booleanValue) - 检查是否为 null 值
  2. .filter(p -> p).map(m -> callFunctionWhenTrue()) - 过滤器检查布尔值为 true 并应用映射函数
  3. .orElse(doSomethingWhenFalse()) - 如果布尔值为 false,则执行此部分

2
应该使用 orElseGet 而不是 orElse - slartidan
如果 booleanValue 为 null,则抛出异常。 错误: | 不兼容类型:lambda 表达式中的错误返回类型 | 无法将 java.lang.Object 转换为布尔值 - Sunil Kapil

-1

你可以把它缩小一点。

Optional<Boolean> spouseIsMale= Optional.of(true);
spouseIsMale.ifPresent(v -> { if (v) System.out.println("There is a male spouse.");});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接