Powtarzanie jest matką nauki. Chociaż o przełączniku w Javie mówiliśmy już wcześniej , dzisiaj przypomnimy sobie podstawy i przeanalizujemy kilka nowych informacji.
Java ma 2 warianty przełącznika - są to instrukcja przełącznika i wyrażenie przełącznika. Wyrażenie switch było oficjalnie w Javie w wersji 14, mając wcześniej 2 modyfikacje w wersjach 12 i 13.
Ale zacznijmy od nowa, pamiętajmy, jak wyglądał stary dobry przełącznik przed wersją 12:
public String getProductTypeByName(String product) {
String productType = "";
switch (product) {
case "Apple":
productType = "Fruit";
break;
case "Peach":
productType = "Fruit";
break;
case "Raspberry":
productType = "Berry";
break;
case "Cherry":
productType = "Berry";
break;
case "Tomato":
productType = "Vegetables";
break;
default:
productType = "other";
break;
}
return productType;
}
instrukcja switch to zestaw konstrukcji, które będą wykonywane jedna po drugiej, nie pozwalając na zwrócenie wyniku wykonania. Głównym problemem związanym z używaniem instrukcji switch jest to, że umożliwia ona dodanie nieskończonej liczby instrukcji case , co jest często nadużywane przez programistów.
W Javie 12 został dodany jako funkcja eksperymentalna, a nie jako instrukcja switch, ale jako wyrażenie switch - nowa wersja przełącznika, która umożliwia zapisanie wyniku wykonania, wykorzystanie podejścia funkcjonalnego wewnątrz i pogrupuj wartość w wyrażeniach case, czyniąc ją zwartą.
Możesz przepisać metodę getProductTypeByName() przy użyciu języka Java 12 w następujący sposób:
public String getProductTypeByName(String product) {
return switch (product) {
case "Apple", "Peach" -> "Fruit";
case "Raspberry", "Cherry" -> "Berry";
case "Tomato" -> "Vegetables";
default -> "other";
};
}
Teraz kod wygląda na czystszy. Wykorzystanie składni strzałek z programowania funkcyjnego umożliwia zwracanie wartości bez słowa kluczowego break , a generalnie wynik wykonania przełącznika można teraz zapisać do zmiennej lub zwrócić przez return .
W przypadkach, gdy musisz nie tylko zwrócić wynik, ale także mieć kilka linii kodu, przełącznik będzie wyglądał następująco:
public String getProductTypeByName(String product) {
var result = switch (product) {
case "Apple", "Peach" -> {
System.out.println("This is fruit");
break "Fruit";
}
case "Raspberry", "Cherry" -> {
System.out.println("This is a Berry");
break "Berry";
}
case "Tomato" -> {
System.out.println("This is a Vegetables");
break "Vegetables";
}
default -> {
break "other";
}
};
return result;
}
W Javie 13 wyrażenie przełączające nadal ma status funkcji eksperymentalnej i aby było dostępne do uruchomienia, tak jak w Javie 12, należy użyć polecenia --enable-preview do kompilacji i uruchomienia. Główną i w zasadzie jedyną „nowością” switcha w Javie 13 jest słowo kluczowe yield , które zastąpiło break .
public String getProductTypeByName(String product) {
var result = switch (product) {
case "Apple", "Peach" -> {
System.out.println("This is fruit");
yield "Fruit";
}
case "Raspberry", "Cherry" -> {
System.out.println("This is a Berry");
yield "Berry";
}
case "Tomato" -> {
System.out.println("This is a Vegetables");
yield "Vegetables";
}
default -> {
System.out.println("Other");
yield "other";
}
};
return result;
}
Główna różnica między yield a break polega na tym, że break zwraca sterowanie z przypadku - polecenie, gdy yield zwraca wynik z całego przełącznika , pełniąc rolę wewnętrznego zwrotu -a.
W Javie 14 operator instanceOf zmienił się i teraz można go używać w następujący sposób:
if(o instanceof String s) {
s.toLowerCase();
}
Zamiast starej i niezbyt pięknej wersji, gdzie oprócz sprawdzenia instanceOf konieczne jest również rzutowanie zmiennej na konkretny typ.
if(s instanceof String) {
((String) s).toLowerCase();
}
Zmiany te są częścią projektu Amber, którego celem jest dodanie obsługi dopasowywania wzorców do języka Java.
Dzięki zmianie operatora instanceOf w wersji 14 oraz rozszerzeniu w wersji 16, Pattern Matching zostało jednak dodane do wersji 17. To prawda, na razie tylko jako podgląd i możesz to przetestować za pomocą --enable-preview :
public String getObjectType(Object object) {
return switch (object) {
case Integer i -> "Integer";
case Long l -> "Long";
case String s -> "String";
default -> object.toString();
};
}
Ogólnie rzecz biorąc, z każdą nową wersją w języku pojawia się coraz więcej interesujących funkcji programistycznych, co czyni Javę jeszcze fajniejszą.
GO TO FULL VERSION