有没有更简单的方法来检查if语句中的一个值的多个值?

基本上,我想要做的是检查给定值的两个整数,因此,通常你会做的是这样的事情:

//just to get some values to check int a, b; a = (int)(Math.random()*5); b = (int)(Math.random()*5); //the actual thing in question if(a == 0 || b == 0) { //Then do something } 

但有没有更简洁的格式来做到这一点? 可能与此类似(返回错误的操作数类型):

 //just to get some values to check int a, b; a = (int)(Math.random()*5); b = (int)(Math.random()*5); //the actual thing in question if((a||b) == 0) { //Then do something } 

不幸的是,Java中没有这样的构造。

这种比较在您的代码中经常出现,您可以实现一个小function,为您执行检查:

 public boolean oneOfEquals(int a, int b, int expected) { return (a == expected) || (b == expected); } 

然后你可以像这样使用它:

 if(oneOfEquals(a, b, 0)) { // ... } 

如果您不想将yourselft限制为整数,则可以使上述函数具有通用性:

 public  boolean oneOfEquals(T a, T b, T expected) { return a.equals(expected) || b.equals(expected); } 

请注意,在这种情况下,Java运行时将对基本类型(如int )执行自动装箱和拆箱 ,这是性能损失。

您可以在普通java中执行以下操作

 Arrays.asList(a, b, c, d).contains(x); 

我觉得有点OR:

 if ((a | b) == 0) . . . 

如果你想专门检查0我会工作。我不确定这是否节省了任何执行时间。 更重要的是,它产生了神秘的代码,这将使这个代码的未来维护者诅咒你(即使它自己)。 我建议坚持使用更多打字选项。

呸。 我误读了OP的原始逻辑。

另一个去……

如果要测试许多变量中的任何一个是否等于期望值,通用函数可能会起作用:

 public  boolean exists(T target, T... values) { for (T value : values) { if (target == null) { if (value == null) { return true; } } else if (target.equals(value)) { return true; } } return false; } 

这适用于任何数量的一种类型的对象。 基元将被自动装箱,因此它也可以与它们一起使用。 您的原始代码将类似于:

 if (test(0, a, b)) { // do something } 

(一个更好的方法名称甚至需要考虑这是否是对你现在所拥有的改进。即使测试扩展到3或4个变量,我也质疑这种事情的必要性。)注意这也适用于数组:

 int[] values = { . . . }; if (test(0, values)) { . . . 

它可用于测试数组(或任何变量集合)是否为null

 if(a == 0 || b == 0) { //Then do something } 

为什么不让它可读? 有什么简洁的? 另一方面,

 a = (int)(Math.random()*5); 

涉及不必要的演员。 为什么不使用Random并调用nextInt()

对于这个例子,你可以做到

 if (a * b == 0) 

或者更多变量

 if (a * b * c * d == 0) 

虽然更简洁,但可能不那么清楚。 对于较大的值,您需要强制转换为避免溢出。

您可以将整数放在一个集合中,看它是否包含给定值。 使用番石榴 :

 if(newHashSet(a, b).contains(0)){ // do something } 

但在这种情况下,两个简单的int比较可能更容易理解。

这是@ buc的答案的修改,可以接受任意数量的任何参数:

 public  boolean oneOfEquals(T expected, T... os) { for (T o : os) { if (expected.equals(o)) return true; } return false; } 

即使您已经使用Ted建议的逐位操作,表达式也不相等,因为需要至少一个变量为零,第二个要求它们都为零。

关于你的问题,Java中没有这样的捷径。

你可以试试这段代码:

 public static boolean match (Object ref, Object... objects) { if (ref == null) return false; // for (Object obj : objects) if (obj.equals (ref)) return true; // return false; } // match 

所以如果你能这样检查:

 if (match (reference, "123", "124", "125")) ; // do something 

从这个答案中可以看出 :

在Java 8+中,您可以使用StreamanyMatch 。 就像是

 if (Stream.of(b, c, d).anyMatch(x -> x.equals(a))) { // ... do something ... } 

请注意,如果检查,这有可能比另一个运行 ,因为开始将这些元素包装到流中的开销。

没有特殊的语法。 你可以为此做一个function。 假设至少Java 1.5:

 public  boolean eitherOneEquals(T o1, T o2, T expectedValue) { return o1.equals(expectedValue) || o2.equals(expectedValue); } if(eitherOneEquals(o1, o2, expectedValue)) { // do something... }