没有if和switch的条件语句

时间:2018-02-02 12:00:55

标签: 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语句或开关的情况下重写该程序?如果是这样的话?

8 个答案:

答案 0 :(得分:4)

您可以使用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没有什么不同。

答案 1 :(得分:3)

可能正在使用Optional:

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");
}

答案 2 :(得分:2)

结帐:

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");
}

或者您可以使用while

b = true;
while(b)
{
    hello();
    break;
}

答案 3 :(得分:2)

简单回答:

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

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

答案 4 :(得分:1)

如果允许修改greet(),可以对原始代码进行非常少的更改来完成:

public static void main(String[] args) {
    boolean greet = true;
    boolean dummy = greet && greet();
}

public static boolean greet() {
    System.out.println("Hello");
    return true;
}

答案 5 :(得分:0)

有许多方法可以在没有if语句的情况下分支到代码块。我将从简单开始,然后转移到复合体。

  1. 您可以使用switch语句。它基本上是一个复合if语句,具有更多条件。
  2. 您可以使用三元运算符?。这将使用两个值之一替换条件,并且可以像if语句一样使用。
  3. 您可以使用条件跳转。基本上,您将条件的每个结果的代码块的主体存储为Map中的值,其中键是已评估条件的值。然后,您评估条件,并运行代码。例如

    myMap.get(age&gt; 3).execute();

  4. 其中myMap是带

    的地图
     Map(true) = block of code to `execute()` if true.
     Map(false) = block of code to `execute()` if false.
    

    有很多方法可以解决这个问题。这些只是一些常见的。

    ---用例子编辑,正如PrzemysławMoskal要求的那样:) ---

    我看到你对三元和null的混淆,但海报不会打印null任何一个条件的情况,他们打算打印String

    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));
      }
    
    }
    

    或其他方法

    public class Hello {
    
      private static Map<Boolean, Runnable> response;
    
      public static void main(String[] args) {
         // setup the response map
         response = new HashMap<>();
         response.put(Boolean.TRUE, new Runnable() {
           public void run() {
             System.out.println("Hello");
           }
         });
         response.put(Boolean.FALSE, new Runnable() {
           public void run() {
           }
         })
    
         boolean value = true;
         response.get(value).run();
      }
    
    }
    

    或另一个例子

    System.out.println((condition) ? "Hello" : "");
    

    但是,三元操作很可能返回null

    (condition) ? null : "hi";
    

    是一个有效的表达式,前提是nullhi在您编写该表达式的上下文中都有效。

答案 6 :(得分:0)

我认为 编译器技巧问题。

根据问题greeting设置为true false不可更改

如果我们设置: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
}

因此:如果greeting设置为true:则无需if。如果greeting设置为false:则无需ifhello()方法。因此,最终代码中没有任何if可以将其更改为其他内容。

答案 7 :(得分:-1)

由于我第一次尝试回答这个问题并没有得到好评,我试图再做一个。

在根据这个问题的一个答案进行了一些讨论之后,我一直在寻找一种方法来使用三元运算符(condition ? value1 : value2)来调用返回值为void的方法,我认为这是相当的不可能,因为value1value2不能成为调用此类方法的结果,因为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;
    }
}