Operator warunkowy (trenary operator). Czytam opis na wiki i nie rozumiem… ale u mnie panuje trzydniówka i nie potrafię się skupić.
w programowaniu konstrukcja języka programowania, w których odróżnia się wyrażenia od instrukcji, będący formą instrukcji warunkowej wyrażoną za pomocą operatora trójargumentowego; bywa ona instrukcją wyrażeniową.
W kodzie występuje z reguły tak:
condition ? true : false
Przykład z życia – tworzę sobie okienko dialogowe do dodawania/edycji posiłku. Jeśli okienko służy do edycji przekazuję do funkcji obiekt meal, jeśli jest to dodawanie nowego, to meal jest nullem.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
builder.setPositiveButton(meal == null ? R.string.add : R.string.edit, new DialogInterface.OnClickListener() { | |
@Override | |
public void onClick(DialogInterface dialog, int which) { | |
mealName = input.getText().toString(); | |
if (meal != null) { | |
mealContract.updateMeal(builder.getContext(), mealName, meal); | |
} else { | |
mealContract.insertMeal(builder.getContext(), mealName); | |
} | |
adapter.updateResults(mealContract.getAllMealsArray(dbHelper)); | |
} | |
}); |
Wykorzystuję operator warunkowy żeby w zależności od tego czy obiekt meal jest nullem, czy nie ustawiać na przycisku tekst „dodaj” lub „edytuj”
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
meal == null ? R.string.add : R.string.edit |
Ten zapis jest chyba o wiele bardziej czytelny niż zrobienie tego samego za pomocą if-else. Jeszcze w takim miejscu jak konstruktor przycisku.
P.S. W fajnych językach jak groovy ( 😉 ) występuje jeszcze coś takiego jak skrócony operator trójwartościowy (Elvis).
Uff, w C# też jest podobny operator („??”). Już się bałem że piszę w języku który nei jest fajny 😛
w C# fajny jest też Linq, ale to było dawno jak w nim pisałam – mogło się coś zmienić od tego czasu 😉
Na szczęście nie zmieniło i nadal jest fajny 🙂
Elvis Elvisem, a niektóre fajne języki zamiast takich kombinacji pozwalają zrobić po prostu:
name = user.name || 'Default name’
😉