繁体   English   中英

函数if if在布尔值上

[英]functional if else on a Boolean

我想在布尔可选值上做一个非常基本的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());

并不能完全得到语法?

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

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

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

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

这会将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,不存在。
Optional不提供执行此类逻辑的直接方法。


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

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

尽管如此,这不是你使用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");
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM