Просто пытаюсь понять, как использовать несколько вариантов для оператора переключения Java. Вот пример того, что я пытаюсь сделать:
switch (variable)
{
case 5..100:
doSomething();
break;
}
вместо того, чтобы делать:
switch (variable)
{
case 5:
case 6:
etc.
case 100:
doSomething();
break;
}
Есть идеи, если это возможно, или какая хорошая альтернатива?
java
syntax
switch-statement
FunJavaCode
источник
источник
Ответы:
К сожалению, в Java это невозможно. Вам придется прибегнуть к использованию
if-else
операторов.источник
if/elseif/else
операторов, независимо от языка.Второй вариант вполне подойдет. Я не уверен, почему ответчик сказал, что это невозможно. Это нормально, и я все время так делаю:
источник
Вне:
Источник: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html
источник
Может быть, не так элегантно, как некоторые предыдущие ответы, но если вы хотите добиться случаев переключения с несколькими большими диапазонами, просто заранее объедините диапазоны в один случай:
источник
case 1
означаетvariable == 1
, что в конечном итоге приведет к путанице и большим неудобствам. Если вам нужно разместить в коде комментарии, чтобы сделать его читабельным, значит, вы сделали что-то не так, ИМХО.Один объектно - ориентированный вариант замены чрезмерно большой
switch
иif/else
конструкции является использованиеChain of Responsibility Pattern
для моделирования процесса принятия решений.Схема цепочки ответственности
Вот пример реализации, которая также является Type Safe с использованием Generics.
Это просто соломинка, которую я придумал за несколько минут, более сложная реализация может позволить внедрить какой-то вид
Command Pattern
вCase
экземпляры реализаций, чтобы сделать его более похожим на стиль обратного вызова IoC.Как только в этом подходе хорошо то, что все операторы Switch / Case касаются побочных эффектов, это инкапсулирует побочные эффекты в классах, чтобы ими можно было управлять и лучше использовать повторно, в конечном итоге это больше похоже на сопоставление с шаблоном на функциональном языке и это не плохо.
Я буду публиковать любые обновления или улучшения этого Gist на Github.
источник
По этому вопросу это вполне возможно.
Просто объедините все кейсы, содержащие одну и ту же логику, и не откладывайте
break
их.Потому что
case
безbreak
перескочит к другомуcase
доbreak
илиreturn
.РЕДАКТИРОВАТЬ:
Отвечая на комментарий, если у нас действительно 95 значений с той же логикой, но гораздо меньшее количество случаев с другой логикой, мы можем сделать:
Если вам нужен более тонкий контроль,
if-else
это выбор.источник
case
операторов!). Боюсь, я согласен с принятым ответом.В принципе:
Если вам действительно нужно использовать переключатель, это потому, что вам нужно делать разные вещи для определенных диапазонов. В этом случае да, у вас будет беспорядочный код, потому что все становится сложным, и только те вещи, которые следуют шаблонам, будут хорошо сжиматься.
Единственная причина для переключения - сэкономить на вводе имени переменной, если вы просто проверяете числовые значения переключения. Вы не собираетесь включать 100 вещей, и все они не будут делать одно и то же. Это больше похоже на кусок «если».
источник
// Пример несовместимого кода
// Соответствующее решение
источник
Из последнего выпуска java-12 в функции предварительного просмотра доступно несколько констант в одной метке case.
Это выглядит как:
См. Больше JEP 325: Switch Expressions (предварительная версия)
источник
С этим можно справиться с помощью библиотеки Vavr
Это, конечно, лишь небольшое улучшение, так как все случаи по-прежнему нужно перечислять явно. Но определить собственный предикат легко:
Match - это выражение, поэтому здесь оно возвращает что-то вроде
Runnable
instance вместо прямого вызова методов. После того, как матч проведен,Runnable
может быть выполнен.Для получения дополнительных сведений см. Официальную документацию .
источник
в качестве альтернативы вы можете использовать, как показано ниже:
или следующий код также работает
источник
JEP 354: Switch Expressions (Preview) в JDK-13 и JEP 361: Switch Expressions (Standard) в JDK-14 расширяет оператор switch, чтобы его можно было использовать как выражение .
Теперь вы можете:
case L ->
):Пример выражения переключения:
источник
Альтернативой вместо использования жестко заданных значений может быть использование сопоставлений диапазонов в операторе switch:
источник