有没有更简单的方法来检查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+中,您可以使用
Stream
和anyMatch
。 就像是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... }