Java 8 練習問題 上級編 その7
Java 8 練習問題 上級編
Java 8 練習問題 上級編
動作環境と問題内容について
javaの練習問題です。 出題範囲はjava 8 で追加された範囲を中心とします。難易度は Java SE 8 Programmer II の試験と同程度※を想定しています。
※ただし、場合によっては同試験には出題されない内容や形式が含まれることもあります。あくまでも難易度の目安として解答してください。
実行環境は以下の通りです。
JDKのバージョン:java 8 Update181
※問題文に書いてあるプログラムを実行する際は自己責任で実行してください。
問題
次のプログラムを作成した。コンパイル、実行に関して以下の問いに答えなさい。
プログラム(Sample.java)
import java.util.stream.Stream; public class Sample{ public static void main(String[] args){ Stream.generate(() -> 0) .forEach(System.out::print); } }
問.Sample.javaをコンパイル、実行するとどうなるか。下記の選択肢 a ~ g から正しいものを選べ。
選択肢
a. 0と表示される
b. null が表示される
c. 表示が無限ループする
d. コンパイルエラー
e. 実行時エラー
f. コンパイル・実行ともにできるが何も表示されない
g. コンパイル・実行ともにできるが実行結果は不定である
解答
c. 表示が無限ループする
解説
今回も Stream API の generate() メソッドを利用した問題となっている。
Stream の終端操作で forEach() メソッドを利用している。処理内容はメソッド参照を利用した表示となっている。
generate() メソッドは Oracle の 公式ドキュメント によると「指定されたSupplierによって生成される要素を含む、順序付けされていない無限順次ストリームを返します。」となっている。引数には Supplierインタフェースを実装したオブジェクトをとる。
今回の問題文を見ると、 Supplierインタフェースをラムダ式で適切に実装している。
また、generate() メソッドで生成されるストリームは「無限順次ストリーム」となっている。
以上から、表示が無限ループする。
Stream API の利用時にはラムダ式やメソッド参照も多用されるため、それらに十分に慣れておく必要がある。
また、Java 7 以前の環境にはなかった書き方なので、Java 7 以前から Java を扱っている場合でも、設計や実装時には十分に注意する必要がある。
参考:Stream API でよく利用されるインタフェース
※の項目は、Java 8 のAPIの公式リファレンスより。
インタフェース名 | インタフェースの説明※ |
抽象メソッド | 抽象メソッドの説明※ |
備考 | |
Stream API を利用した際の使い方の例 |
Consumer | 単一の入力引数を受け取って結果を返さないオペレーションを表します。 |
accept | 指定された引数でこのオペレーションを実行します。 |
1つの引数をもとに処理を行うが、結果は返さない。 | |
forEach() メソッドと組み合わせて処理を完了する(accept)際に使われる。 |
Function | 1つの引数を受け取って結果を生成する関数を表します。 |
apply | 指定された引数にこの関数を適用します。 |
1つの引数をもとに何か値を返す。 | |
map() メソッドと組み合わせて Stream の要素を写し返る(mapping)際に使われる。 |
Predicate | 1つの引数の述語(boolean値関数)を表します。 |
test | 指定された引数でこの述語を評価します。 |
引数をもとに、真偽値を返す。 | |
filter() メソッドと組み合わせて、条件を満たしている要素を選別(filter)する際に利用される。 |
Supplier | 結果のサプライヤを表します。 |
get | 結果を取得します。 |
引数なしで、何らかの値を返す。 | |
generate() メソッドと組み合わせて、生成する Stram に要素を取得(get)する際に利用される。 |
オススメ!!→ java 8 の問題はこちら オススメ!!→ javaのプログラム作成形式の練習問題はこちら オススメ!!→ Macで日本語化済のEclipseを導入する方法その1 その2 オススメ!!→ java関連の記事はこちら