Java 8 練習問題 その6


java練習問題

java練習問題

動作環境と問題内容について

javaの練習問題です。 出題範囲はjava 8 で追加された範囲を中心とします。難易度は Java SE 8 Programmer I の試験と同程度※を想定しています。

※ただし、場合によっては同試験には出題されない内容や形式が含まれることもあります。あくまでも難易度の目安として解答してください。

実行環境は以下の通りです。

PC:MacBook Pro 2011early 15inch

OS:Windows 8.1(デュアルブート) 64bit版

メモリ:16GB(8GB x 2)

CPU:Core i7-2635QM 2.00GHz

javaのバージョン:java 8 Update102

 

※問題文に書いてあるプログラムを実行する際は自己責任で実行してください。

問題

次のプログラムを作成した。コンパイル、実行に関して以下の問いに答えなさい。

 

プログラム(Sample.java)

public class Sample{
  public static void main(String[] args){
    MyInterface obj = /*[A]*/
  }
}

interface MyInterface{
 boolean myMethod(Object val1, Object val2);
}

 

問./[A]/の部分に入れてコンパイルしてもコンパイルエラーにならないものを以下の選択肢からすべて選びなさい。

 

選択肢

 /* a */
  (Object val1, Object val2) -> {
    return val1.equals(val2);
  }; //OK

 /* b */
  Object val1, Object val2 -> {
    return val1.equals(val2);
  }; //NG

 /* c */
  (Object val1, val2) -> {
    return val1.equals(val2);
  }; //NG

 /* d */
  Object val1, val2 -> {
    return val1.equals(val2);
  }; //NG

 /* e */
  (val1, val2) -> {
    return val1.equals(val2);
  }; //OK

 /* f */
  val1, val2 -> {
    return val1.equals(val2);
  }; //NG

 /* g */
  (Object val1, Object val2) -> return val1.equals(val2); //NG

 /* h */
  (Object val1, Object val2) -> {
    val1.equals(val2);
  }; //NG

 /* i */
  (Object val1, Object val2) -> val1.equals(val2); //OK

 /* j */
  () -> {
    return val1.equals(val2);
  }; //NG

 /* k */
  (val1, val2) -> val1.equals(val2); //OK

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

解答

 

a,e,i,k

 

 

解説

今回もラムダ式を利用して関数型インタフェースの実装を行います。今回実装する関数型インタフェースの抽象メソッドには引数が2つ定義されています。

interface MyInterface{
  boolean myMethod(Object val1, Object val2);
}

これをもとに、それぞれの選択肢を見ていきます。

※解答解説の後に省略の可否の一覧でまとめてあるので、ラムダ式の省略について良く分からない場合はそちらを先にご覧ください。

 

選択肢 解答・解説
/* a */
(Object val1, Object val2) -> {
  return val1.equals(val2);
};
 ・省略なし

○ コンパイル可能

省略を行っておらず、データ型に矛盾もない。

/* b */
Object val1, Object val2 -> {
  return val1.equals(val2);
};
・ 引数の( )を省略

× コンパイルエラー

( )が省略できるのは引数が1つのときのみで、その引数のデータ型も同時に省略されていなければならない。

/* c */
(Object val1, val2) -> {
  return val1.equals(val2);
};
・val2のデータ型のみ省略

× コンパイルエラー

引数のデータ型を省略する場合はすべての引数でデータ型を省略する必要がある。

一部の引数のみデータ型を省略するとコンパイルエラーとなる。

/* d */
Object val1, val2 -> {
  return val1.equals(val2);
};
 ・val2のデータ型と引数の( )を同時に省略

× コンパイルエラー

データ型の省略が中途半端である。また、引数が1つではないため( )の省略もできない。

/* e */
(val1, val2) -> {
  return val1.equals(val2);
};
・引数のデータ型をすべて省略

○ コンパイル可能

引数のデータ型は省略可能である。引数のデータ型を省略する場合はすべての引数でデータ型を省略する必要がある。

/* f */
val1, val2 -> {
  return val1.equals(val2);
};
 ・引数のデータ型すべてと引数の( )を省略

× コンパイルエラー

( )が省略できるのは引数が1つのときのみで、その引数のデータ型も同時に省略されていなければならない。

 

/* g */
(Object val1, Object val2)
   -> return val1.equals(val2);

※スペースの都合で改行

 ・戻り値の{ }を省略

× コンパイルエラー

{ }を省略する場合は処理が1行である必要がある。戻り値はあっても良いが、その場合はreturn キーワードは必ず省略しなければならない。

/* h */
(Object val1, Object val2) -> {
  val1.equals(val2);
};
・return キーワードを省略

× コンパイルエラー

戻り値がある場合に処理がreturn文しかなければ、returnのキーワードと{ }を同時に省略することができる。
どちらか一方のみを省略するとコンパイルエラーとなる。

/* i */
(Object val1, Object val2)
   -> val1.equals(val2);

※スペースの都合で改行

・return キーワードと{ }を同時に省略

○ コンパイル可能

戻り値がある場合に処理がreturn文しかなければ、returnのキーワードと{ }を同時に省略することができる。

※ { } が省略できるのは処理が1行のみの場合だけなので要注意。
※ あくまで「return」というキーワードが省略されているだけで戻り値自体は必要なので要注意。

 

/* j */
() -> {
  return val1.equals(val2);
};
・引数を省略

× コンパイルエラー

引数を省略することはできない。
※ただし、将来的に何らかの変更が加わる可能性はある。

/* k */
(val1, val2) -> val1.equals(val2);
・引数のデータ型をすべて省略 ※1

・return キーワードと( )を同時に省略 ※2

○コンパイル可能

今回可能な省略をすべて使用した形。

※1を行う場合、すべての引数で省略しなければならない。
※2を行う場合、処理内容が1行でなければならない。

 

まとめると以下の通り。(前回までの表に引数が2個の場合を追加。)

引数が1つの場合と2つ以上の場合の違いは、引数の( )を省略可能かどうかであり、それ以外については引数の数が1つでも2つ以上でも変わらない。

 

ラムダ式の省略可否一覧
省略個所 引数1つ 引数2つ以上  注意点
 引数のデータ型 ○ 省略可能 ○ 省略可能 ・データ型が省略されている引数とされていない引数が混ざっている場合は省略できない。

※省略する場合は必ずすべての引数のデータ型を省略すること。

引数の( ) △ 省略可能
※ 条件付き
× 省略不可 ・引数なしの場合は省略できない。

・引数が2つ以上の場合は省略できない。

・ 引数のデータ型が書いてあると( )は省略できない。

 

※引数が1つで、データ型が省略されている時のみ省略可能。

処理の{ } △ 省略可能
※ 条件付き
△ 省略可能
※ 条件付き
・処理が2行以上にわたる場合は省略できない。

・処理が ; しかない場合は省略できない。(プログラムの構造がおかしくなるため)

・戻り値がある場合、return キーワードが書いてあると省略できない。

 

※処理が1行しかない場合は省略可能。戻り値がある場合は下記参照。

(戻り値がある場合)
return キーワード
△ 省略可能
※ 条件付き
△ 省略可能
※ 条件付き
・return 文以外の処理もある場合は省略できない。

・{ } が書いてあると省略できない。

 

※ 処理内容がreturn 文のみで、{ }も省略する場合のみ省略可能。その場合、処理内容には戻り値のみが書かれる。

戻り値そのものがなくなるわけではないので注意。

引数名 × 省略できない × 省略できない  ・引数名は省略できない。

 

※ただし、引数名はもとのインタフェースと異なっていても良い。ローカル変数のスコープに注意して変数名を定義すること。

 

 

 

そのほかのjavaの練習問題はこちら

そのほかのjava関連の記事はこちら

  • このエントリーをはてなブックマークに追加

PAGE TOP