函数if if在布尔值上

问题描述 投票:3回答:3

我想在布尔可选值上做一个非常基本的if else。我想我遗漏了一些非常基本的东西

所以旧学校如果其他巢就是这样的

    if (filterValue.isPresent()) {
        if (filterValue.get()==true) {
            method1();
        } else {
            method2();
        }
    } else {
        method3();
    }

我尝试了2次替换的各种尝试

filterValue.map(o -> o.TRUE ? method1() : method2()).orElse(method3());

filterValue.isPresent(filterValue.get().TRUE ? method1() : method2());

并不能完全得到语法?

有人能指出我正确的方向吗?

java java-8 optional
3个回答
5
投票

map不起作用,因为method1method2都没有返回值。并且不允许映射到void

目前Java 8中没有真正的解决方案,但如果您碰巧使用Java 9,则可以使用ifPresentOrElse(Consumer<T>, Runnable>)实现它:

filterValue.ifPresentOrElse(value -> {
    if(value){
        method1();
    } else {
        method2();
    }
}, () -> method3());

2
投票

尽管如此,这不是你使用Optionals的方式,你可以这样试试:

import java.util.Optional;

public class Test {

  public static void main(String[] args) {
    final Optional<Boolean> filterValue = Optional.of(true);
    // final Optional<Boolean> filterValue = Optional.of(false);
    // final Optional<Boolean> filterValue = Optional.empty(); // thx @Holger

    Runnable methodToCall = filterValue
        .map(b -> b ? (Runnable) Test::method1 : (Runnable) Test::method2)
        .orElse(Test::method3);

    methodToCall.run();
  }

  private static void method1() {
    System.out.println("Method1");
  }

  private static void method2() {
    System.out.println("Method2");
  }

  private static void method3() {
    System.out.println("Method3");
  }
}

2
投票

这将Optional映射到方法的返回值:

filterValue.map(o -> o.TRUE ? method1() : method2()).orElse(method3());

它不是你想要的,而且只有在方法返回并且它们之间兼容的情况下才会编译。

虽然这不能编译,因为isPresent()不接受任何参数但返回boolean

filterValue.isPresent(filterValue.get().TRUE ? method1() : method2());

旧学校的方式是满足您要求的方式。 引入Optional以防止NullPointerException。 在某些特定情况下,如果你想将Optional映射到另一个东西,它将节省条件语句:Foo foo = Optional.map(..).map(...).get();。 但是你不是这种配置:你想根据Optional的3个不同状态调用一个不同的方法:present和true,present和false,ifsent。 Optional不提供执行这种逻辑的直接方法。


通过降低嵌套级别,您的代码可以更具可读性:

if (filterValue.isPresent() && filterValue.get()) {
    method1();
} else if (filterValue.isPresent()) {
    method2();
} else {
    method3();
}
© www.soinside.com 2019 - 2024. All rights reserved.