Java 是否有一种更简单的方法来检查if语句中的多个值和一个值?
基本上,我想做的是根据给定的值检查两个整数,因此,经典的做法是这样的:Java 是否有一种更简单的方法来检查if语句中的多个值和一个值?,java,Java,基本上,我想做的是根据给定的值检查两个整数,因此,经典的做法是这样的: //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 } if(oneOfEquals(a, b, 0)) { // .
//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
}
if(oneOfEquals(a, b, 0)) {
// ...
}
但是有没有更简洁的格式来做这件事呢?可能与此类似(返回错误的操作数类型):
我认为这有点明智,或者:
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;
}
(一个更好的方法名称,甚至需要考虑这是否比现在有了改进。即使测试扩展到3个或4个变量,我也怀疑是否需要这样的事情。)注意,这也适用于数组:
。int[] values = { . . . };
if (test(0, values)) { . . .
它可以用来测试数组(或变量集合中的任何一个)是否为
null
没有特殊的语法。你可以为此做一个函数。假设至少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...
}
public boolean eitheronequals(tO1、tO2、tExpectedValue){
返回o1.equals(expectedValue)| o2.equals(expectedValue);
}
if(Etheronequals(o1,o2,预期值)){
//做点什么。。。
}
不幸的是,Java中没有这样的构造
如果这种比较在代码中很常见,您可以实现一个小函数来为您执行检查:
public boolean oneOfEquals(int a, int b, int expected) {
return (a == expected) || (b == expected);
}
然后你可以这样使用它:
//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
}
if(oneOfEquals(a, b, 0)) {
// ...
}
如果不想将自身限制为整数,可以将上述函数设置为通用函数:
public <T> boolean oneOfEquals(T a, T b, T expected) {
return a.equals(expected) || b.equals(expected);
}
public boolean一个或多个相等(预期为ta、tb、T){
返回a.equals(预期)| b.equals(预期);
}
请注意,在这种情况下,Java运行时将对基本类型(如int
)执行自动装箱和取消装箱,这是一种性能损失
if(a == 0 || b == 0)
{
//Then do something
}
为什么不保持可读性?这有什么不简洁的?另一方面,
a = (int)(Math.random()*5);
涉及不必要的演员阵容。为什么不直接使用
Random
并调用nextInt()
?即使使用了Ted建议的逐位运算,表达式也不相等,因为一个要求至少一个变量为零,另一个要求两个变量都为零
关于您的问题,Java中没有这样的快捷方式。对于本例,您可以这样做
if (a * b == 0)
或者更多的变量
if (a * b * c * d == 0)
虽然更简洁,但可能没有那么清楚。对于较大的值,您需要强制转换为一个
long
,以避免溢出。您可以将整数放入一个集合中,查看它是否包含给定的值:
但在这种情况下,两个简单的int比较可能更容易理解。您可以尝试以下代码:
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
下面是对@buc答案的修改,可以接受任意数量的参数:
public <T> boolean oneOfEquals(T expected, T... os) {
for (T o : os) {
if (expected.equals(o)) return true;
}
return false;
}
public boolean oneOfEquals(预期为T,实际为T…os){
用于(TO:os){
if(预期值等于(o))返回true;
}
返回false;
}
您可以在纯java中执行以下操作
Arrays.asList(a, b, c, d).contains(x);
:
在Java8+中,您可以使用流
和anyMatch
。差不多
if (Stream.of(b, c, d).anyMatch(x -> x.equals(a))) {
// ... do something ...
}
请注意,由于将这些元素包装到流中的开销,这可能会比其他if检查运行得慢。在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,则返回true,否则返回false
noneMatch:如果没有任何谓词返回true,则返回true,否则返回false
性能注意事项:当您有足够的数据量
检查一下,因为它有一些开销,但当您使用
这需要足够的数据量。普通的方法只适合两个人
条件
你为什么要这样做?可能是重复的,因为代码看起来会更好?这是一种使包含许多变量的if语句对同一个变量进行检查变得更简洁的方法。@grapeot:这是一样的;将
0
替换为x
,将a
和b
替换为整数文本。但是有什么方法可以概括这一点吗?如中所示,我不只是检查0,还可以将这些值与另一个变量进行比较,例如名为“c”的int不起作用-如果a=1;b=0代码>,您的测试失败,原始测试通过。不,这是相反的,可以替换a==0&&b==0
。使用按位and没有帮助(例如,对于两个不同的二次幂)@grapeot两个算术的模幂有零除数,这意味着a*b=0
并不意味着a
或b
都是零。@grapeot否。。因为那是不正确的。如果a*b
恰好为零,则a
和b
存在值,使得a
和b
都不为零。例如,a=0x80000000 b=2
我从来没有听说过这门课,我一直被教导使用Math.random(),特别是因为它可以很容易地适应我想要创建的值的范围。使用random可以很容易地确定值的范围。例如,1-6:1+myRand.nextInt(5)之间的随机数;
private boolean methodName(int variant,int... args){
if(args.length > 0){ return Arrays.stream(args).anyMatch( x -> x == variant); }
return false;
}