こんにちは。今回の記事は三項演算子についてです。Javaの演算子のひとつに三項演算子というものがあります。三項演算子では、条件式を使います。条件式がtrueの場合とfalseの場合で値を分岐することが出来ます。
今回の記事では、この演算子の使い方を記事にしました。なお、この演算子は条件演算子とも言います。
三項演算子の書き方
三項演算子を使った命令文では、以下の3つを書きます。
- 条件式
- 条件式がtrueの場合の値
- 条件式がfalseの場合の値
以下のように記号「?」と「:」を使って記述します。
書き方の例
int x = 1;
String str;
str = x == 1 ? "A" : "B"; // (1)
System.out.println(str);
結果
A
上記の(1)の右辺が三項演算子を使った個所です。以下のように構成されています。
x == 1 | 条件式 |
"A" | trueの場合の値 |
"B" | falseのの場合の値 |
上記サンプルでは変数xに値1が格納されています。(1)の三項演算子で記述した条件式「x == 1」の結果はtrueです。そのため、(1)の右辺は文字列「A」になります。この文字列が変数strに格納されるため、コンソールに「A」と出力されます。
上記サンプルのように、三項演算子を使って、値を分岐させることができます。
三項演算子とif文との類似点
三項演算子は条件式がtrueまたはfalseの場合の値を指定します。if文との類似点は1つ変数の値をtrueまたはfalseで分岐する点です。
例えば、以下のようなメソッドを作成するとします。
- 引数
- boolean flg
- 戻り値
- String型
- 処理内容
-
- String型変数sを宣言し、nullで初期化する。
-
- flagがtrueの場合、sに文字列「A」を格納する。
- flagがfalseの場合、sに文字列「B」を格納する。
- sを返却する。
以下、if文を使った場合と三項演算子を使った場合を書いてみました。
ソース
public class Sample002 {
public static void main(String[] args) {
Sample002 sample002 = new Sample002();
String s;
System.out.println("method1の場合");
s = sample002.method1(true);
System.out.println(s);
s = sample002.method1(false);
System.out.println(s);
System.out.println("method2の場合");
s = sample002.method2(true);
System.out.println(s);
s = sample002.method2(false);
System.out.println(s);
}
private String method1(boolean flg) {
String s = null;
if (flg) {
s = "A";
} else {
s = "B";
}
return s;
}
private String method2(boolean flg) {
String s = null;
s = flg ? "A" : "B";
return s;
}
}
結果
method1の場合
A
B
method2の場合
A
B
method1()メソッドでは、if-else文を使って上記内容を実装しました。変数flgはboolean型なので、if文の条件式にそのまま記述することが出来ます。flgがtrueの場合、最初のブロックが実装され、変数sに「A」が格納されます。
method2()メソッドでは、三項演算子を使って上記内容を実装しました。条件式を記述する箇所にはboolean型変数flgをそのまま記述することが出来ます。
上記のように、if-else文の代わりに三項演算子を使うことが出来ます。
三項演算子でnullを回避
三項演算子の他の使い方の例として、変数がnullの場合、その変数に特定の値を格納するということができます。
例えば、String型変数について、その値がnullの場合、他の値に置き換えたいとします。if文を使うこともできますが、三項演算子でも置き換えができます。
Stringは参照型変数なのでnullという値で初期化可能です。しかし、値がnullの変数をprintlnの引数に指定した場合、「null」という文字そのものが出力されます。また、文字列連結でもその変数の個所は「null」という文字列に置き換わります。それを回避するために、三項演算子を使ってnullの場合は他の文字列で置き換えることができます
以下にサンプルを挙げました。
ソース
public class Sample003 {
public static void main(String[] args) {
Sample003 sample003 = new Sample003();
System.out.println("(1)");
String s = null;
System.out.println("こんにちは。" + s + "さん。");
System.out.println("(2)");
System.out.println("変数sの値がnullの場合");
sample003.printName(s);
System.out.println("(3)");
System.out.println("変数sの値がnullでない場合");
s = "太郎";
sample003.printName(s);
}
private void printName(String s) {
s = s == null ? "名無し" : s; // nullの場合は特定の文字列
System.out.println("こんにちは。" + s + "さん。");
}
}
結果
(1)
こんにちは。nullさん。
(2)
変数sの値がnullの場合
こんにちは。名無しさん。
(3)
変数sの値がnullでない場合
こんにちは。太郎さん。
上記のプログラムのprintName()メソッドでは、三項演算子を使って、変数sの値を変更しています。変数sがnullである場合、特定の文字列を格納しています。falseの場合の指定が変数s自身なので、falseの場合は変数sの値は変化しません。
(1)では変数sの値がnullなので、文字列結合で「null」という文字列そのものが使われます。
(2)ではprintName()メソッドの引数に変数sを指定しています。メソッドの内部では、変数sの値はnullです。三項演算子で変数sの値が書き換えられます。変数sがnullなので、文字列「名無し」が代入されます。
(3)もprintName()メソッドの引数に変数sの値を指定しています。メソッドの内部は、変数sの値はnullではありません。三項演算子の命令文の結果は変数s自身です。その結果、変数sの値は変化しません。そのため、メソッドの引数に渡したときの値が出力されます。
以上、参考になれば幸いです。