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)
import java.util.function.Predicate; public class Sample{ public static void main(String[] args){ Predicate<String> pre = /*[A]*/ } }
問./*[A]*/の部分に入れてコンパイルしてもコンパイルエラーにならないものを以下の選択肢からすべて選びなさい。
選択肢
/* a */ (String t) -> { return t.equals("a"); }; /* b */ (Object t) -> { return t.equals("a"); }; /* c */ (String t) -> return t.equals("a"); /* d */ (String t) -> { t.equals("a"); }; /* e */ (String t) -> t.equals("a"); /* f */ String t -> { return t.equals("a"); }; /* g */ (t) -> { return t.equals("a"); }; /* h */ t -> { return t.equals("a"); }; /* i */ Object t -> { return t.equals("a"); }; /* j */ () -> { return t.equals("a"); }; /* k */ t -> t.equals("a");
解答
a,e,g,h,k
解説
今回は関数型インタフェース「Predicate」を実装している。「Predicate」は、java 8 で新しく作られた java.util.functionパッケージに属するインタフェースである。引数を1つ受け取り、boolean型の値を返す抽象メソッド「test」メソッドが定義されている。今回はこのtestメソッドをラムダ式で実装することになる。
なお、本問には関係ないが、それ以外にも複数のdefaultメソッドとstaticメソッドが定義されている。
概要は以下の通り。
public interface <span class="typeNameLabel">Predicate<T></span>{ boolean test(T t); //省略 }
インタフェースの宣言時にジェネリクスが使用されており、各メソッドでもこのジェネリクスが使用されている。
今回、変数preの実装時にはジェネリクスでString型を指定している。
以上をもとに、それぞれの選択肢を見ていく。
※解答解説の後に省略の可否の一覧でまとめてあるので、ラムダ式の省略について良く分からない場合はそちらを先にご覧ください。
選択肢 | 解答・解説 |
---|---|
/* a */ (String t) -> { return t.equals("a"); }; |
・引数のデータ型にString型を指定
○ コンパイル可能 ジェネリクスでString型が指定されており、引数はString型になっている。そのため、矛盾が生じない。 |
/* b */ (Object t) -> { return t.equals("a"); }; |
・ 引数のデータ型にObject型を指定
× コンパイル可能 ジェネリクスではString型が指定されているにもかかわらず、引数はObject型になっている。 そのため、矛盾が生じる。 ※ラムダ式というよりもジェネリクスの使い方の問題 |
/* c */ (String t) -> return t.equals("a"); ※スペースの都合で改行 |
・ { } を省略
× コンパイルエラー { }を省略する場合は処理が1行である必要がある。戻り値はあっても良いが、その場合はreturn キーワードは必ず省略しなければならない。 |
/* d */ (String t) -> { t.equals("a"); }; |
・return キーワードを省略
× コンパイルエラー return キーワードが省略される場合は必ず{ }も省略する。 |
/* e */ (String t) -> t.equals("a"); ※スペースの都合で改行 |
・ return と { }を同時に省略
○ コンパイル可能 戻り値がある場合に処理がreturn文しかなければ、returnのキーワードと{ }を同時に省略することができる。 ※ { } が省略できるのは処理が1行のみの場合だけなので要注意。 |
/* f */ String t -> { return t.equals("a"); }; |
・引数の( )を省略
× コンパイルエラー ( )が省略できるのは引数が1つで、その引数のデータ型も同時に省略されていなければならない。 |
/* g */ (t) -> { return t.equals("a"); }; |
・引数のデータ型を省略
○ コンパイル可能 引数のデータ型は省略可能である。ただし、引数のデータ型を省略する場合はすべての引数でデータ型を省略する必要がある。 一部の引数のみデータ型を省略するとコンパイルエラーとなる。 |
/* h */ t -> { return t.equals("a"); }; |
・引数のデータ型と( )を同時に省略
○ コンパイル可能 引数のデータ型は省略が可能である。その際、引数が1つだけであれば( )も同時に省略可能である。 |
/* i */ Object t -> { return t.equals("a"); }; |
・引数の( )を省略
× コンパイル可能 選択肢 f とほぼ同じで、( )だけが省略されている時点でコンパイルエラー。 加えて、引数のデータ型がObject型となっておりジェネリクスとも矛盾する。 |
/* j */ () -> { return t.equals("a"); }; |
・引数を省略
× コンパイルエラー 引数を省略することはできない。 |
/* k */ t -> t.equals("a"); |
・引数のデータ型と、( )を同時に省略 ※1
・return キーワードと( )を同時に省略 ※2 ○ コンパイル可能 今回可能な省略をすべて使用した形。 引数が無かったり、引数が2つ以上ある場合は※1の省略ができない。 |
まとめると次のようになる。(前回までと同じ表です。)
ラムダ式の省略可否一覧
省略個所 | 省略の可否 | 注意点 |
---|---|---|
引数のデータ型 | ○ 省略可能 | ・データ型が省略されている引数とされていない引数が混ざっている場合は省略できない。
※省略する場合は必ずすべての引数のデータ型を省略すること。 |
引数の( ) | △ 省略可能 ※ 条件付き |
・引数なしの場合は省略できない。
・引数が2つ以上の場合は省略できない。 ・ 引数のデータ型が書いてあると( )は省略できない。
※引数が1つで、データ型が省略されている時のみ省略可能。 |
処理の{ } | △ 省略可能 ※ 条件付き |
・処理が2行以上にわたる場合は省略できない。
・処理が ; しかない場合は省略できない。(プログラムの構造がおかしくなるため) ・戻り値がある場合、return キーワードが書いてあると省略できない。
※処理が1行しかない場合は省略可能。戻り値がある場合は下記参照。 |
(戻り値がある場合) return キーワード |
△ 省略可能 ※ 条件付き |
・return 文以外の処理もある場合は省略できない。
・{ } が書いてあると省略できない。
※ 処理内容がreturn 文のみで、{ }も省略する場合のみ省略可能。その場合、処理内容には戻り値のみが書かれる。 ※ 戻り値そのものがなくなるわけではないので注意。 |
引数名 | × 省略できない | ・引数名は省略できない。
※ただし、引数名はもとのインタフェースと異なっていても良い。ローカル変数のスコープに注意して変数名を定義すること。 |
オススメ!!→ java 8 の問題はこちら