Java 8 練習問題 上級編 その11
Java 8 練習問題 上級編
Java 8 練習問題 上級編
動作環境と問題内容について
javaの練習問題です。 出題範囲はjava 8 で追加された範囲を中心とします。難易度は Java SE 8 Programmer II の試験と同程度※を想定しています。
※ただし、場合によっては同試験には出題されない内容や形式が含まれることもあります。あくまでも難易度の目安として解答してください。
実行環境は以下の通りです。
JDKのバージョン:java 8 Update191
※問題文に書いてあるプログラムを実行する際は自己責任で実行してください。
問題
次のプログラムを作成した。コンパイル、実行に関して以下の問いに答えなさい。
プログラム(Sample.java)
import java.util.stream.Stream; import java.util.ArrayList; import java.util.Optional; public class Sample{ public static void main(String[] args){ ArrayList<String> list = new ArrayList<>(); list.add("b"); list.add("c"); list.add("a"); Optional<String> optStr = list.stream() .sorted() .findFirst(); System.out.println(optStr.get()); } }
問.Sample.javaをコンパイル、実行するとどうなるか。下記の選択肢 a ~ g から正しいものを選べ。
選択肢
a. aと表示される
b. bと表示される
c. nullと表示される
d. コンパイルエラー
e. 実行時エラー
f. コンパイル・実行ともにできるが何も表示されない
g. コンパイル・実行ともにできるが実行結果は不定である
解答
a. aと表示される
解説
今回は ArrayList 型のオブジェクトの stream() メソッドを利用してストリームを生成し、中間操作としてsorted() メソッドを、終端操作として findFirst() メソッドを利用している。
stream() メソッドは Oracle の公式ドキュメントによると次のように記載されている。
「このコレクションをソースとして使用して、逐次的な Stream を返します。 」
また、今回はジェネリクスで Collection の要素に String 型を指定している。そのため、生成される Stream も、String 型を要素とする Stream となる。
sorted() メソッドは Oracle の公式ドキュメントによると次のように記載されている。
「このストリームの要素を自然順序に従ってソートした結果から構成されるストリームを返します。このストリームの要素がComparableでない場合は、終端操作の実行時にjava.lang.ClassCastExceptionがスローされる可能性があります。」
今回の場合、ストリームの要素は String 型になっている。String 型には Comparable インタフェースが実装されているため、自然順序が決められている。
※参考:今回の場合、sorted() メソッド使用後の Stream の要素の順序は a b c の順になっている。
Stream の終端操作で findFirst() メソッドを利用している。findFirst() メソッドの解説は上級編 その9で解説している。
今回は、sorted() メソッドが呼び出された後の Stream の先頭要素が返ってくる。
以上から、aと表示される。
似たような機能が提供されているクラス同士では、メソッド名や引数、戻り値のデータ型が紛らわしいものもある。実装時には注意すること。
Stream API の利用時にはラムダ式やメソッド参照も多用されるため、それらに十分に慣れておく必要がある。
また、Java 7 以前の環境にはなかった書き方なので、Java 7 以前から Java を扱っている場合でも、設計や実装時には十分に注意する必要がある。
参考:Stream API でよく利用されるメソッド(抜粋)
※の項目は、Java 8 のAPIの公式リファレンスより。
メソッド名 | sorted() |
操作の種類 | 中間操作 |
戻り値の型 | Stream<T> |
説明(抜粋)※ | このストリームの要素を自然順序に従ってソートした結果から構成されるストリームを返します。 |
補足 | 要素が自然順序付けに並べ替えられた(sorted)ストリームを返す。 |
メソッド名 | findFirst() |
操作の種類 | 短絡終端操作 |
戻り値の型 | Optional<T> |
説明(抜粋)※ | このストリームの最初の要素を記述するOptionalまたは空のOptional (ストリームが空の場合)を返します。 |
補足 | ストリームの先頭(first)の要素を見つけ出す(find)。nullだった場合でも安全に操作できるようにOptional<T>を戻り値としている。 |
<<前回の問題はこちら | 第1問はこちら | 次の問題はこちら>>
オススメ!!→ java 8 の問題はこちら オススメ!!→ javaのプログラム作成形式の練習問題はこちら オススメ!!→ Macで日本語化済のEclipseを導入する方法その1 その2 オススメ!!→ java関連の記事はこちら