понеділок, 15 листопада 2021 р.

Інструкція Switch (Java)

Інструкція if/else може бути доволі громіздкою, якщо необхідно здійснити множинний вибір з багатьох альтернатив. Тож як і в С/C++ в java існує інструкція switch, яка здійснити вибір з багатьох варіантів. Щоправда вона дещо незграбна і деякі програмісти вважають за краще уникати її використання.

Наприклад, якщо Ви організовуєте певне меню і пропонуєте користувачу вибрати, номер конкретного пункту, то можна використати наступний код:
Scanner in = new Scanner(System.in);
System.out.print("Select an option (1, 2, 3, 4) ");
int choice = in.nextInt();
switch (choice) {
     case 1:
         . . .
         break;
     case 2:
         . . .
         break;
     case 3:
         . . .
         break;
     case 4:
         . . .
         break;
     default:
         // bad input
         . . .
         break;
}
Якщо пропустити інструкцію break, то всі інші інструкції будуть також виконані. Тобто якщо справдиться умова першого варіанту, то будуть здійснені ще й дії вказані для виконання у всіх інших варіантах до наступної інструкції break.
	int k=1;
	switch (k) {
	     case 1:
	         System.out.print(1);
	     case 2:
	         System.out.print(2);
	     case 3:
	         System.out.print(3);
	         break;
	     case 4:
	         System.out.print(4);
	         break;
	     default:
             // викинути виняток (виведе помилку при виконанні програми)
	    	 throw new IllegalStateException("Unexpected value: " + k);
	}
Як результат буде виведено: 123

До версії Java 7, яка вийшла у 2011 році, case мітка мала бути лише цілим числом або нумерованою константою. Починаючи із Java 7 можна перевіряти таким чином на рівність також рядки:
String input = . . .;
switch (input)  	
{
    case "A":		 
        . . .
        break;
    . . .
}
В Java 12 з'явилася можливість повертати значення з інструкції switch за допомогою ключового слова break, проте в Java 13 для цього ввели додаткове слово yield, а використовувати для цього break заборонили.
        int result = switch (mode) {
            case "A":
                yield 1;
            case "B":
                yield 2;
            . . .
В Java 12 також для switch з'явився синтаксис подібний до лямбда виразів з підтримкою повернення значення із switch:
		String str="A";
		var result = switch (str) {
		    case "A" -> 1;
		    case "B" -> 2;
		    case "C" -> 3;
		    case "D" -> 4;
		    default -> throw new IllegalStateException("Unexpected value: " + str);
		};
		System.out.println(result); //result=1
Аналогічний результат можна отримати так:
		String str="A";
		int result; 
		switch (str) {
		    case "A" -> result=1;
		    case "B" -> result=2;
		    case "C" -> result=3;
		    default -> throw new IllegalStateException("Unexpected value: " + str);
		};
		System.out.println("result="+result);
Запримітьте, що інструкція break вже не потрібна. Якщо потрібно, щоб виконалось декілька випадків, то використовуємо кому між значеннями case (раніше для цього спеціально пропускалась інструкція break):
		String str="A";
		var result = switch (str) {
		    case "A","B","C" -> 1;
		    case "D" -> 4;
		    default -> throw new IllegalStateException("Unexpected value: " + str);
		};
		System.out.println(result); //result=1
Якщо потрібно виконати певні інструкції в блоці, то для повернення результату використовується інструкція yield (починаючи з Java 13):
		String str="C";
		var result = switch (str) {
		    case "A" -> 1;
		    case "B" -> 2;
		    case "C" -> {
		        System.out.println("3!");
		        yield 3; // return 3
		    }
		    default -> throw new IllegalStateException("Unexpected value: " + str);
		};
		System.out.println("result="+result); //result=3
Замість цифри, при поверненні, може використовуватися змінна або вираз.
	int x=2;
	int y=3;
	String str="C";
	var result = switch (str) {
    		case "A" -> x+y;
		. . .

Немає коментарів:

Дописати коментар