运营商中的Java

Luk*_*der 32 java syntactic-sugar jls in-operator

对于百万分之一的时间,我本来希望IN在Java中使用运算符,类似于INSQL中的运算符.它可以作为编译器语法糖实现.所以这

if (value in (a, b, c)) {
}
else if (value in (d, e)) {
}
Run Code Online (Sandbox Code Playgroud)

......真的很棒.事实上,上面的内容与这里相当冗长(并且不适用于原语)的构造相同:

if (Arrays.asList(a, b, c).contains(value)) {
}
else if (Arrays.asList(d, e).contains(value)) {
}
Run Code Online (Sandbox Code Playgroud)

或者这样的int,long和类似的形式:

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

  case d:
  case e:
    // ..
    break;
 }
Run Code Online (Sandbox Code Playgroud)

或者可能有更高效的实现.

题:

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

Pet*_*rey 19

您可以编写辅助方法来执行此操作.

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)) {

}
Run Code Online (Sandbox Code Playgroud)


Aar*_*lla 14

使用op4j:

Op.onListFor(a,b,c).get().contains(value);
Run Code Online (Sandbox Code Playgroud)

使用相同的方法,你可以创建一个辅助类Is用的方法in:

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 );
    }
}
Run Code Online (Sandbox Code Playgroud)

使用静态导入,您可以编写:

if(is(value).in(a,b,c)) {
}
Run Code Online (Sandbox Code Playgroud)


Mis*_*ble 7

收集文字有一个非常古老的提议.

目前Sets.newHashSet在番石榴中有非常相似的Arrays.asList.


Ada*_*kin 6

您正在寻找Java社区流程