格式化多个';或';if语句中的条件(Java)

格式化多个';或';if语句中的条件(Java),java,syntax,if-statement,Java,Syntax,If Statement,这是一个简单的问题,但谷歌帮不了多少忙 我有一个包含许多条件的if语句(必须检查10或15个常量,看看是否存在其中任何一个。) 而不是像这样写: if (x == 12 || x == 16 || x == 19 || ...) 有没有办法把它格式化成这样 if x is [12, 16, 19]? 只是想知道是否有一个更简单的方法来编码这个,任何帮助表示感谢 编辑:答案非常有用,但有几个人要求我补充更多细节,所以我会这样做以满足他们的好奇心。我正在制作一个日期验证类,需要确保在只有30天的

这是一个简单的问题,但谷歌帮不了多少忙

我有一个包含许多条件的if语句(必须检查10或15个常量,看看是否存在其中任何一个。)

而不是像这样写:

if (x == 12 || x == 16 || x == 19 || ...)
有没有办法把它格式化成这样

if x is [12, 16, 19]?
只是想知道是否有一个更简单的方法来编码这个,任何帮助表示感谢

编辑:答案非常有用,但有几个人要求我补充更多细节,所以我会这样做以满足他们的好奇心。我正在制作一个日期验证类,需要确保在只有30天的月份中,天数不超过30天(我想有4天),我正在编写一个if语句来检查以下内容:

if (day > 30 && (month == 4 || month == 6 || month == 9 || month == 11))

我只是想知道是否有更快的方法来编写类似的代码-下面的许多答案都有帮助:)。

您可以查找地图键的存在或查看它是否在一个集合中


但是,根据您实际执行的操作,您可能试图解决错误的问题:)

使用某种类型的集合-这将使代码更具可读性并隐藏所有这些常量。一个简单的方法是列出:

// Declared with constants
private static List<Integer> myConstants = new ArrayList<Integer>(){{
    add(12);
    add(16);
    add(19);
}};

// Wherever you are checking for presence of the constant
if(myConstants.contains(x)){
    // ETC
}
//用常量声明
私有静态列表myConstants=newArrayList(){{
增加(12);
增加(16);
增加(19);
}};
//无论您在哪里检查常量的存在
if(myConstants.contains(x)){
//等
}
正如波希米亚人指出的,常数列表可以是静态的,因此可以在多个地方访问


对于任何感兴趣的人,我的示例中的列表都使用了。自从我最近遇到它以来,我发现它非常适合编写快速脏列表初始化。

你想切换到这个吗

switch(x) {
    case 12:
    case 16:
    case 19: 
        //Do something
        break;
    default:
        //Do nothing or something else..
        break;
}

如果一组可能性是“紧凑”(即最大值-最小值,即小于200),则可以考虑查找表。如果你有一个像这样的结构,这将是非常有用的

if (x == 12 || x == 16 || x == 19 || ...)
else if (x==34 || x == 55 || ...)
else if (...)
设置一个数组,其中的值标识要执行的分支(上例中的1、2、3),然后您的测试成为

switch(dispatchTable[x])
{
    case 1:
        ...
        break;
    case 2:
        ...
        break;
    case 3:
        ...
        break;
}
这是否合适取决于问题的语义


如果数组不合适,可以使用
映射
,或者如果只想测试单个语句的成员资格,则可以使用
。但是,对于一个简单的
if
语句来说,这是一个很大的火力,因此如果没有更多的上下文,就很难将您引导到正确的方向。

我经常使用这种模式。它非常紧凑:

// Define a constant in your class. Use a HashSet for performance
private static final Set<Integer> values = new HashSet<Integer>(Arrays.asList(12, 16, 19));

// In your method:
if (values.contains(x)) {
    ...
}

但是要知道,它每次执行时都会创建一个新的
ArrayList

不,在Java中不能这样做。但是,您可以编写如下方法:

boolean isContains(int i, int ... numbers) {
    // code to check if i is one of the numbers
    for (int n : numbers) {
        if (i == n) return true;
    }
    return false;
}

使用Java 8,您可以使用基本流:

if (IntStream.of(12, 16, 19).anyMatch(i -> i == x))

但这可能会有轻微的开销(或没有),这取决于比较的次数。

您能举一个更好的例子来说明您要做什么吗?也许一个解决方案就在于考虑这个?或者
if(Arrays.asList(newint[]{12,16,19}).contains(x)){…}
@Bala-sure!无论如何,列表只是此处使用的集合的一个示例。正如另一个答案所建议的那样,设置一组可能更好地确保常数是唯一的。。。如果(Arrays.asList(12,16,19).contains(x)),我宁愿使用
Set
而不是
List
,但这对这几个元素没有任何影响。@Joachim Sauer采纳了你的想法-这也是一个好主意!HashSet会快很多:
private static final ImmutableSet value=ImmutableSet.of(12,16,19)
if (IntStream.of(12, 16, 19).anyMatch(i -> i == x))