33

第 100 万次,我希望使用INJava 中的运算符,类似于INSQL 中的运算符。它可以作为编译器语法糖来实现。所以这

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

或者也许会有更有效的实现。

问题:

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

4

5 回答 5

21

您可以编写一个辅助方法来执行此操作。

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

}
于 2011-09-12T16:25:13.367 回答
14

使用op4j

Op.onListFor(a,b,c).get().contains(value);

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

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

if(is(value).in(a,b,c)) {
}
于 2011-11-08T13:58:19.170 回答
7

集合文字有一个非常古老的提议。

目前Sets.newHashSet在 Guava 中与Arrays.asList.

于 2011-09-12T16:02:16.043 回答
6

您正在寻找Java 社区流程

于 2011-09-12T15:54:02.273 回答
1

我怀疑是否会提供诸如 IN 运算符之类的东西,因为正如您自己指出的那样,已经有多种方法可以做到这一点(比如使用 switch)。

我认为 project-coin 和 J8 的需求列表已经完全加载,可以考虑这样的事情。

于 2011-09-12T16:00:09.233 回答