Java 不带if和switch的条件语句

Java 不带if和switch的条件语句,java,Java,我有以下代码: public static void main(String[] args){ boolean greeting = true; //or false if(greeting) hello(); } public static void hello(){ System.out.println("Hello") } 如果greeting的值设置为true,我想调用hello方法而不使用(if,switch) 不使用if语句或

我有以下代码:

public static void main(String[] args){
    boolean greeting = true;        //or false
    if(greeting)
        hello();
}

public static void hello(){
    System.out.println("Hello")
}
如果greeting的值设置为true,我想调用hello方法而不使用(if,switch)


不使用if语句或开关是否可以重新编写此程序?如果是,怎么做?

有很多方法可以在不使用if语句的情况下分支到代码块中。我将从简单开始,然后转到复杂

  • 您可以使用
    开关
    语句。它基本上是一个复合
    if
    语句,带有更多条件
  • 您可以使用三元运算符
    。这将用两个值中的一个替换条件,并且可以像
    if
    语句一样使用
  • 你可以使用条件跳跃。基本上,您将条件的每个结果的代码块体作为值存储在
    映射中
    ,键是已计算条件的值。然后计算条件并运行代码。比如说

    get(age>3.execute()

  • 其中
    myMap
    是具有

     Map(true) = block of code to `execute()` if true.
     Map(false) = block of code to `execute()` if false.
    
    有很多方法可以做到这一点。这些只是一些常见的

    ---根据Przemysław Moskal要求的示例进行编辑:)---

    我看到你对三元和返回的
    null
    感到困惑,但是海报不会打印
    null
    ,在这两种情况下,他们都会打印
    字符串

    public class Hello {
    
      private static Map<Boolean, String> response;
    
    
      public static void main(String[] args) {
         // setup the response map
         response = new HashMap<>();
         response.put(Boolean.TRUE, "Hello");
         response.put(Boolean.FALSE, "");
    
         boolean value = true;
         System.out.println(response.get(value));
      }
    
    }
    
    然而,三元操作很可能返回
    null

    (condition) ? null : "hi";
    
    是有效的表达式,前提是
    null
    hi
    在编写该表达式的上下文中都有效。

    请检查以下内容:

    public static void main(String[] args)
    {
        boolean b = true;
        Predicate<Boolean> p = s -> {hello();return true;};
        boolean notUsefulVariable = b && p.test(true);      //will be called
        b = false;
        notUsefulVariable = b && p.test(true);              //will not called
    
    
    }
    
    public static void hello(){
        System.out.println("Hello");
    }
    

    您可以使用
    enum

    enum Greeting {
        GREETING(() -> System.out.println("hello")),
        NO_GREETING(() -> {});
    
        private final Runnable greeting;
    
        private Greeting(Runnable r) {
            greeting = r;
        }
        public void greet() {
            greeting.run();
        }
    }
    
    然后有

    public static void main(String[] args) {
        Greeting gr = Greeting.GREETING;   // or Greeting.NO_GREETING
        // or if you insist on the boolean
        // Greeting gr = (greeting) ? Greeting.GREETING : Greeting.NO_GREETING;
        gr.greet();
    }
    
    这也可以扩展到

    CORDIAL_GREETING(() -> System.out.println("hi wow so nice to see you"))
    
    在枚举中

    注释中的三元运算符当然与if/else没有什么区别。

    简单回答:

    public static void main(String[] args){
        boolean greeting = true;        //or false
        while(greeting) {
            hello();
            break;
        }
    }
    

    这可能不是很优雅,但这不是问题所在,这是最简单的解决方案(至少是我能想到的)。

    由于我第一次尝试回答这个问题没有得到很好的接受,我尝试再回答一个问题

    在对这个问题的一个答案进行了一些讨论之后,我正在寻找一种方法,使用三元运算符(
    条件?value1:value2
    )调用返回值为
    void
    的方法,我认为这是不可能的,因为
    value1
    value2
    不能是调用
    hello()
    之类的方法的结果。如果需要使用三元运算符,我想这是使用该运算符的唯一可能方法,使附加操作最少:

    public class MyClass {
    
        public static void main(String[] args){
            boolean greeting = true;        //or false
            checkIfGreetingIsTrue(greeting);
        }
    
        public static void hello(){
            System.out.println("Hello");
        }
    
        public static Void checkIfGreetingIsTrue(boolean greeting) {
            return greeting ? callHelloInMyBody() : null;
        }
    
        public static Void callHelloInMyBody() {
            hello();
            return null;
        }
    }
    

    可以使用可选的:

    public static void main(String[] args){
        Optional<Boolean> greeting = Optional.of(false);
        greeting.filter(g->g).ifPresent(g->hello());
    }
    public static void hello(){
        System.out.println("Hello");
    }
    
    publicstaticvoidmain(字符串[]args){
    可选问候语=可选的.of(false);
    greeting.filter(g->g).ifPresent(g->hello());
    }
    公共静态void hello(){
    System.out.println(“你好”);
    }
    
    我认为这只是一个编译器的问题

    基于问题
    问候语
    设置为
    不可更改

    如果我们设置:
    boolean greeting=true,编译器忽略
    if
    命令并将其删除

    public static void main(String[] args){
        boolean greeting = true;
        // if(greeting)   ---ignores with Compiler
             hello();
    }
    
    但是,如果我们设置:
    boolean greeting=false,编译器将所有
    if
    命令忽略为死代码,并删除所有
    if

    public static void main(String[] args){
        boolean greeting = false;
        // if(greeting)   ---ignores with Compiler as Dead Code
        //     hello();   ---ignores with Compiler as Dead Code
    }
    

    因此:如果
    问候语
    设置为
    :如果
    ,则无需
    。如果
    问候语
    设置为
    :则无需使用
    if
    hello()
    方法。因此,在最终代码中没有任何
    if
    ,可以将其更改为其他内容

    如果允许修改
    greet()
    ,只需对原始代码进行很少的更改即可:

    public static void main(String[] args) {
        boolean greet = true;
        boolean dummy = greet && greet();
    }
    
    public static boolean greet() {
        System.out.println("Hello");
        return true;
    }
    

    如果
    有什么错?@EdwinBuck太糟糕了,学校把重点放在了错误的事情上。我不明白威尔这个问题有什么价值。@Maroun我同意,任何提出这个问题的学校都认为这是在教东西,但实际上他们可以问“你读过三元运算符吗?”“与其试图通过诱使学生认为这是一种先进的技巧来表现自己的聪明,@Federicoperalthaffner作业中甚至还有一个问题:如果问候语的值设置为true@FedericoPeraltaSchaffner这是因为
    if
    已经是解决问题的最简单技术。这就像问“如果你没有一杯水,你怎么能喝一个容器的水?”基本上你会得到的答案都类似于把容器称为玻璃杯以外的东西。但是,在一天结束的时候,一个木桶水就像一个大的、木头的、玻璃的东西<不使用代码>开关
    。在问题中看到,啊,没有读到那么远。我保留它是为了完整性,即使它被明确排除。@EdwinBuck如果我';我错了,但我';我很确定你们不能将返回void的方法指定为三元运算符的结果之一。这两种结果都必须是无效的。if运算符和三元运算符之间的主要区别是。@EdwinBuck在OP的问题中,当变量为true时,会调用方法hello(),但在注释中的示例中,您可以在“硬编码”字符串或null之间进行选择。你能提供一个例子,在OP的情况下,这个三元运算符应该如何编写?我搞不懂:-/@EdwinBuck,通过写“在OP的情况下”,我的意思是如果“?”之前的操作数中的条件为true,则调用返回void的方法。我看不出有可能按照你提供的方式来做。这对我来说没有意义。在大多数情况下,布尔值不是硬编码值;它将是一个传递给包含代码的函数的值,或者是一个给定给th的参数
    public static void main(String[] args){
        boolean greeting = true;
        // if(greeting)   ---ignores with Compiler
             hello();
    }
    
    public static void main(String[] args){
        boolean greeting = false;
        // if(greeting)   ---ignores with Compiler as Dead Code
        //     hello();   ---ignores with Compiler as Dead Code
    }
    
    public static void main(String[] args) {
        boolean greet = true;
        boolean dummy = greet && greet();
    }
    
    public static boolean greet() {
        System.out.println("Hello");
        return true;
    }