Java в операторе - PullRequest
       21

Java в операторе

32 голосов
/ 12 сентября 2011

В один миллионный раз мне хотелось бы использовать оператор IN в Java, аналогичный оператору IN в SQL.Это может быть просто реализовано как синтаксический сахар компилятора.Так что это

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?Как я могу сделать такое предложение, если нет?Или есть какая-нибудь эквивалентная конструкция, которую я мог бы использовать прямо сейчас?

Ответы [ 5 ]

19 голосов
/ 12 сентября 2011

Вы можете написать вспомогательный метод для этого.

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

}
14 голосов
/ 08 ноября 2011

Использование 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)) {
}
7 голосов
/ 12 сентября 2011

Было очень старое предложение для литералов коллекции .

В настоящее время в Гуаве есть Sets.newHashSet, что очень похоже на Arrays.asList.

6 голосов
/ 12 сентября 2011
1 голос
/ 12 сентября 2011

Я сомневаюсь, что что-то вроде оператора IN будет доступно, поскольку уже есть несколько способов сделать это (например, с помощью switch), как вы сами указали.

И я думаю, что список требований для project-coinи J8 уже полностью загружен, чтобы считаться чем-то подобным.

...