我有这段代码:
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语句或开关的情况下重写该程序?如果是这样的话?
答案 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语句的情况下分支到代码块。我将从简单开始,然后转移到复合体。
switch
语句。它基本上是一个复合if
语句,具有更多条件。?
。这将使用两个值之一替换条件,并且可以像if
语句一样使用。您可以使用条件跳转。基本上,您将条件的每个结果的代码块的主体存储为Map
中的值,其中键是已评估条件的值。然后,您评估条件,并运行代码。例如
myMap.get(age&gt; 3).execute();
其中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";
是一个有效的表达式,前提是null
或hi
在您编写该表达式的上下文中都有效。
答案 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
:则无需if
和hello()
方法。因此,最终代码中没有任何if
可以将其更改为其他内容。
答案 7 :(得分:-1)
由于我第一次尝试回答这个问题并没有得到好评,我试图再做一个。
在根据这个问题的一个答案进行了一些讨论之后,我一直在寻找一种方法来使用三元运算符(condition ? 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;
}
}