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