Java в операторе

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


person Lukas Eder    schedule 12.09.2011    source источник
comment
Я думаю, что в Гуаве должно быть что-то равное.   -  person Thomas Jungblut    schedule 12.09.2011
comment
У вас есть это в Groovy, что похоже на Java ++ :)   -  person Kico Lobo    schedule 12.09.2011
comment
@ Кико Лобо: Приятно знать. К сожалению, я не могу использовать Groovy: - /   -  person Lukas Eder    schedule 12.09.2011
comment
@Thomas Jungblut: У вас есть указатель? Библиотека Guava довольно большая ...   -  person Lukas Eder    schedule 12.09.2011


Ответы (5)


Используя 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)) {
}
person Aaron Digulla    schedule 08.11.2011
comment
Потрясающий! Я как раз собирался спросить, есть ли библиотека именно для такого DSL !! Большое спасибо - person Lukas Eder; 08.11.2011
comment
Забавно, однако, что Op4j почти не используется. При сравнении загрузок, например, с загрузками Lambda-J - person Lukas Eder; 08.11.2011
comment
Да, это один из тех драгоценных камней, которые сидят на вкладке браузера, умоляя, чтобы им воспользовались, но почему-то нет времени начинать с него ... - person Aaron Digulla; 08.11.2011
comment
Я добавил запрос функции, чтобы добавить предложенный вами класс Is в библиотеку. Are также может быть хорошим классом для if (are(val1, val2).allIn(a, b, c)): sourceforge.net /apps/phpbb/op4j/viewtopic.php?f=2&t=15 - person Lukas Eder; 14.11.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)) {

}
person Peter Lawrey    schedule 12.09.2011
comment
Правда, это простейший обходной путь. Я предполагаю, что этот метод isIn также можно было найти в Гуаве, где-то ... - person Lukas Eder; 12.09.2011
comment
Приятно видеть, что на самом деле существует библиотека для таких вспомогательных методов. См. Только что принятый ответ - person Lukas Eder; 08.11.2011

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

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

person Miserable Variable    schedule 12.09.2011
comment
Я был уверен, что видел нечто подобное раньше. Так что это не часть монеты проекта, ни для Java 8 ... Но с этим я мог бы написать [a, b, c].contains(value). Это было бы приемлемо. Так что решение Guava не будет менее подробным. Я думаю, что накладные расходы на HashSet для постоянного небольшого количества элементов не стоят проблем по сравнению с _3 _... - person Lukas Eder; 12.09.2011
comment
Производительность должна быть одинаковой для обоих типов коллекций для небольших размеров. Проблема в том, что он создается каждый раз, когда используется, хотя точка доступа, вероятно, его оптимизирует. С коллекционными литералами, содержащими литералы, это становится тривиальным. - person Miserable Variable; 12.09.2011

Вы ищете процесс сообщества Java

person Adam Batkin    schedule 12.09.2011
comment
Спасибо, я знаю JCP. Я также знаю список рассылки coin-dev. Как я могу увеличить шансы быть услышанным? - person Lukas Eder; 12.09.2011

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

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

person Suraj Chandran    schedule 12.09.2011
comment
Вот чего я и опасался (J8 уже полностью загружен). Но в настоящее время нет ничего более изящного, чем простой оператор IN, который на самом деле делает то, что делает оператор IN. Переключатель ужасно многословен. Arrays.asList(...) содержит, возможно, вариант - person Lukas Eder; 12.09.2011
comment
ты прав. Возможно, мое предложение зайдет слишком далеко. Я бы предпочел ссылку Гермала на предложение Джошуа Блоха о литералах-коллекциях ... - person Lukas Eder; 12.09.2011
comment
@Suraj Chandran: Я согласен: язык не должен поддерживать слишком много идиом программирования, даже если он делает код короче, он усложняет язык и компилятор. - person Giorgio; 12.09.2011