java-beginner.com ブログ

プログラミングを学習するブログ(Javaをメインに)

三項演算子の書き方と動作を確認した

投稿日:

最終更新日:2016年06月21日

アイキャッチ

こんにちは。今回の記事は三項演算子についてです。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型
処理内容
  1. String型変数sを宣言し、nullで初期化する。
    1. flagがtrueの場合、sに文字列「A」を格納する。
    2. flagがfalseの場合、sに文字列「B」を格納する。
  2. 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の値は変化しません。そのため、メソッドの引数に渡したときの値が出力されます。

以上、参考になれば幸いです。