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;
    }