不带赋值的 Java 三元

2022-09-01 06:05:39

有没有办法在不做赋值的情况下执行java三元运算或伪造评估?

我喜欢在做一堆if/then/elses时简洁的三元代码。

我希望能够基于布尔代数语句调用两个 void 函数之一。

像这样:

(bool1 && bool2) ? voidFunc1() : voidFunc2();

我的函数是 返回类型 ,所以如果有一种方法可以在赋值中伪造它以使其工作,那么我对此没问题......我想看看如何做到这一点,虽然:)void


答案 1

不,你不能那样做。规格是这样说的

条件运算符有三个操作数表达式。?出现在第一个和第二个表达式之间,而 : 出现在第二个和第三个表达式之间。

第一个表达式的类型必须是布尔值或布尔值,否则会发生编译时错误。

如果第二个或第三个操作数表达式是 void 方法的调用,则这是一个编译时错误。

[编辑]

既然你问了反思,这里有一个解决方案。我不建议这样做。我发布它只是因为你问了。

public class MyCall
{

    public void a(){System.out.println("a");}
    public void b(){System.out.println("b");}

    public static void main(String... args)
    {
        new MyCall().go();
    }

    public void go()
    {
        Class<? extends MyCall> class1 = this.getClass();
        Method aMethod = class1.getMethod("b", null);
        Method bMethod = class1.getMethod("a", null);
        Object fake = false ? aMethod.invoke(this, null) : bMethod.invoke(this, null);
        Object fake2 = true ? aMethod.invoke(this, null) : bMethod.invoke(this, null);
    }
}

在一天结束时,你必须问问自己,简洁是否能提高代码的可读性(想想每个循环)。恕我直言,这些解决方案都没有提高代码的可读性。如果我是你,我宁愿选择这个。

if(condition)
    a();
else
    b();

我实际上支持包含大括号,即使循环只包含一行,但是由于您要追求清晰的代码,因此上面的代码片段应该可以。


答案 2

不,你不能这样做。

如果不喜欢让它有更多的陈述,你可以更喜欢这种风格。

if(bool1 && bool2) voidFunc1(); else voidFunc2();

在三元运算符中,操作数必须是非空值表达式;也就是说,它们必须产生一些实际价值。