Tips

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;

public class Sample{
    public static void main(String[] args){

        ArrayList<String> list = new ArrayList<>();
        list.add("b");
        list.add("c");
        list.add("a");

        String str = list.stream()
                         .findFirst();

        System.out.println(str);
    }
}

 

問.Sample.javaをコンパイル、実行するとどうなるか。下記の選択肢 a ~ g から正しいものを選べ。

選択肢

a. aと表示される

b. bと表示される

c. nullと表示される

d. コンパイルエラー

e. 実行時エラー

f. コンパイル・実行ともにできるが何も表示されない

g. コンパイル・実行ともにできるが実行結果は不定である

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

解答

 

d. コンパイルエラー

 

解説

今回は Stream の終端操作で findFirst() メソッドを利用している。

findFirst() メソッドは Oracle の 公式ドキュメントによると次のように記載されている。

「このストリームの最初の要素を記述するOptionalまたは空のOptional (ストリームが空の場合)を返します。ストリームが検出順序を持たない場合は、任意の要素が返されます。 これは短絡終端操作です。」

このメソッドに引数はなく、戻り値は Optional 型のオブジェクトである。

 

Optional クラスは JDK 1.8 から追加されたクラスであり、Oracle の 公式ドキュメントによると次のように記載されている。

「null以外の値が含まれている場合も含まれていない場合もあるコンテナ・オブジェクトです。」

なお、今回の問題では、Stream のジェネリクスに String 型が指定されているため、findFirst() メソッドの戻り値の Optional オブジェクトのジェネリクスも、 String 型となっている。

 

問題文を見ると、 findFirst() メソッドの戻り値を String 型の変数 str で参照しようとしている。しかし上述の通り、findFirst() メソッドの戻り値は Optional 型である。String 型と、List 型に継承関係がないように、String 型と Optional 型にも継承関係はない。

 

以上から、コンパイルエラーとなる。

 

Stream API の利用時にはラムダ式やメソッド参照も多用されるため、それらに十分に慣れておく必要がある。

また、Java 7 以前の環境にはなかった書き方なので、Java 7 以前から Java を扱っている場合でも、設計や実装時には十分に注意する必要がある。

 

参考:Stream API でよく利用されるメソッド(抜粋)
※の項目は、Java 8 のAPIの公式リファレンスより。

メソッド名 findFirst()
戻り値の型 Optional<T>
操作の種類 短絡終端操作
説明(抜粋)※ このストリームの最初の要素を記述するOptionalまたは空のOptional (ストリームが空の場合)を返します。
補足 ストリームの先頭の要素を取り出す。nullだった場合でも安全に操作できるようにOptional<T>を戻り値としている。

 


 <<前回の問題はこちら   次の問題はこちら>> 


 オススメ!!→ java 8 の問題はこちら

 オススメ!!→ javaのプログラム作成形式の練習問題はこちら

 オススメ!!→ Macで日本語化済のEclipseを導入する方法その1 その2

 オススメ!!→ java関連の記事はこちら

新連載はじまりました!新Java基礎 連載リンク

はじめてのJAVA 連載

Recent News

Recent Tips

Tag Search