Java in运算符

Java in运算符,java,syntactic-sugar,jls,in-operator,Java,Syntactic Sugar,Jls,In Operator,第一百万次,我希望在Java中使用IN操作符,类似于SQL中的IN操作符。它可以作为编译器语法糖来实现。那么这个 if (value in (a, b, c)) { } else if (value in (d, e)) { } …真是太棒了。事实上,上面的内容与这里相当冗长(且不适用于原语)的结构相同: if (Arrays.asList(a, b, c).contains(value)) { } else if (Arrays.asList(d, e).contains(value)) {

第一百万次,我希望在Java中使用
IN
操作符,类似于SQL中的
IN
操作符。它可以作为编译器语法糖来实现。那么这个

if (value in (a, b, c)) {
}
else if (value in (d, e)) {
}
…真是太棒了。事实上,上面的内容与这里相当冗长(且不适用于原语)的结构相同:

if (Arrays.asList(a, b, c).contains(value)) {
}
else if (Arrays.asList(d, e).contains(value)) {
}
对于
int
long
和类似类型,也可以这样:

switch (value) {
  case a:
  case b:
  case c:
    // ..
    break;

  case d:
  case e:
    // ..
    break;
 }
或者可能会有更高效的实现

问题:
这样的东西会成为Java8的一部分吗?如果没有,我怎么能提出这样的建议呢?或者我现在可以使用任何等效的构造吗?

您正在寻找类似IN操作符的东西,我怀疑它是否可用,因为正如您自己所指出的,已经有多种方法可以做到这一点(如使用开关)


我认为coin和J8项目的需求列表已经全部加载,可以考虑类似的内容。

有一个非常古老的建议


目前,Guava中有一个类似于
数组的方法。asList

您可以编写一个helper方法来实现它

public static <T> boolean isIn(T t, T... ts) {
    for(T t2: ts) 
      if (t.equals(t2)) return true;
    return false;
}

// later
if (isIn(value, a,b,c)) {

} else if (isIn(value, d,e)) {

}
publicstaticbooleanisin(T,T…ts){
对于(t2:ts)
如果(t等于(t2))返回true;
返回false;
}
//后来
if(isIn(值,a,b,c)){
}else if(isIn(值,d,e)){
}
使用:

使用相同的方法,您可以使用中的方法创建助手类
Is

class Is<T> {
    private T value;

    public Is( T value ) { this.value = value; }

    public boolean in( T... set ) {
        for( T item : set ) {
            if( value.equals( item ) ) {
                return true;
            }
        }

        return false;
    }

    public static <T> Is<T> is( T value ) {
        return new Is<T>( value );
    }
}

我认为番石榴应该包含一些相同的东西。Groovy中有这个,就像Java++:)@Kico Lobo:很高兴知道。不幸的是,我不能使用Groovy:-/@Thomas Jungblut:你有指针吗?番石榴图书馆很大…谢谢,我知道JCP。我也知道邮寄名单。我怎样才能增加被听到的机会?这正是我所担心的(J8已经满负荷了)。但目前,没有什么比简单的
IN
操作符更简洁的了,可以像
IN
操作符那样实际执行操作。这个开关非常冗长<代码>数组。asList(…)contains可能是一个选项您是对的。我的建议可能太过分了。我更喜欢Hermal引用Joshua Bloch关于集合文字的主张…@Suraj Chandran:我同意:一种语言不应该支持太多的编程习惯用法,即使它使代码更短,也会使语言和编译器更复杂。我确信我以前见过类似的情况。所以它不是ProjectCoin的一部分,对于Java8也是如此。。。但是有了这个,我可以编写
[a,b,c].contains(value)
。这是可以接受的。所以番石榴的解决方案就不会那么冗长了。我认为,与
数组相比,
哈希集
对于常量、少量元素的开销是不值得的。asList()
…对于较小大小的两种集合类型,性能应该是相似的。问题是每次使用它时都会创建它,尽管hotspot可能会对它进行优化。对于包含变得微不足道的文本的集合文本。没错,这是最简单的解决方法。我猜
isIn
method也可以在番石榴中找到,在某个地方…很高兴看到,实际上有一个库可以用于这种辅助方法。看到新接受的答案太棒了!我只是想问一下,是否有一个专门用于这种DSL的库!!非常有趣的是,Op4j很少被使用。例如,当你将下载内容与下载内容进行比较时,是的,这是一个放在浏览器选项卡上的宝石,请求使用,但不知何故,从来没有时间开始使用它……我添加了一个功能请求,将建议的
is
类添加到库中<对于
if(Are(val1,val2).allIn(a,b,c))
,code>Are可能也是一个很好的类:
class Is<T> {
    private T value;

    public Is( T value ) { this.value = value; }

    public boolean in( T... set ) {
        for( T item : set ) {
            if( value.equals( item ) ) {
                return true;
            }
        }

        return false;
    }

    public static <T> Is<T> is( T value ) {
        return new Is<T>( value );
    }
}
if(is(value).in(a,b,c)) {
}