基本上,我想要做的是检查一个给定值的两个整数,因此,通常你会做的是这样的事情:
//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
}
答案 0 :(得分:25)
不幸的是,Java中没有这样的构造。
在您的代码中经常进行这种比较,您可以实现一个小功能来执行检查:
public boolean oneOfEquals(int a, int b, int expected) {
return (a == expected) || (b == expected);
}
然后你可以像这样使用它:
if(oneOfEquals(a, b, 0)) {
// ...
}
如果您不想将yourselft限制为整数,可以将上述功能设为通用:
public <T> boolean oneOfEquals(T a, T b, T expected) {
return a.equals(expected) || b.equals(expected);
}
请注意,在这种情况下,Java运行时将对基本类型(如int
)执行自动装箱和取消装箱,这是性能损失。
答案 1 :(得分:14)
您可以在普通java
中执行以下操作snapshot-view-pname
答案 2 :(得分:4)
我认为有点OR:
if ((a | b) == 0) . . .
如果你想专门检查0, 会起作用。我不确定这是否可以节省任何执行时间。更重要的是,它会产生神秘的代码,这将使这个代码的未来维护者诅咒你(即使它自己)。我建议坚持使用更多打字选项。
呸。我误读了OP的原始逻辑。
另一个......
如果要测试许多变量中的任何一个是否等于预期值,通用函数可能会起作用:
public <T> 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
。
答案 3 :(得分:2)
if(a == 0 || b == 0)
{
//Then do something
}
为什么不保持可读性?什么不简明扼要?另一方面,
a = (int)(Math.random()*5);
涉及不必要的演员。为什么不使用Random
并调用nextInt()
?
答案 4 :(得分:2)
对于此示例,您可以执行
if (a * b == 0)
或更多变量
if (a * b * c * d == 0)
虽然更简洁但可能不那么清楚。对于较大的值,您需要强制转换为long
以避免溢出。
答案 5 :(得分:2)
您可以将整数放在一个集合中,看看它是否包含给定值。 Using Guava:
if(newHashSet(a, b).contains(0)){
// do something
}
但在这种情况下,两个简单的int比较可能更容易理解。
答案 6 :(得分:2)
这是对@ buc的答案的修改,可以接受任意数量的任何参数:
public <T> boolean oneOfEquals(T expected, T... os) {
for (T o : os) {
if (expected.equals(o)) return true;
}
return false;
}
答案 7 :(得分:1)
即使您使用了Ted建议的逐位操作,表达式也不相同,因为一个变量需要至少一个变量为零,第二个变量需要 它们为零。
关于你的问题,Java中没有这样的捷径。
答案 8 :(得分:1)
您可以尝试以下代码:
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
答案 9 :(得分:1)
As referenced from this answer:
在Java 8+中,您可以使用
这样的东西Stream
和anyMatch
。像if (Stream.of(b, c, d).anyMatch(x -> x.equals(a))) { // ... do something ... }
请注意,如果检查,则有可能运行较慢 ,因为将这些元素包装到流中的开销很快。
答案 10 :(得分:1)
在Java 8中,我们可以使用以下方法实现相同的目的:
private boolean methodName(int variant,int... args){
if(args.length > 0){ return Arrays.stream(args).anyMatch( x -> x == variant); }
return false;
}
如果变体匹配任何可能的输入,则给定的方法将返回true。这用于或条件。
以相同的方式,如果要执行&&(and)条件,则只需使用其他Java 8方法:
注意:这些方法将谓词作为参数。
anyMatch:在第一个谓词返回true时返回true,否则返回false。
allMatch:如果所有谓词均返回true,否则返回false。
noneMatch:如果所有谓词均未返回true,则返回true,否则返回false。
性能注意事项:当您有足够的数据量可以 检查,因为它有一些开销,但是当您使用时它确实很好用 这足以获得足够的数据量。普通方法只适合两个人 条件。
答案 11 :(得分:0)
没有特殊的语法。你可以为此做一个功能。至少假设Java 1.5:
public <T> boolean eitherOneEquals(T o1, T o2, T expectedValue) {
return o1.equals(expectedValue) || o2.equals(expectedValue);
}
if(eitherOneEquals(o1, o2, expectedValue)) {
// do something...
}