java

Java 8 練習問題 上級編 その20


Java 8 練習問題 上級編

Java 8 練習問題 上級編

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

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

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

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

JDKのバージョン:java 8 Update191

 

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

問題

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

 

プログラム(Sample.java)

import java.util.stream.Stream;

public class Sample{
    public static void main(String[] args){
        Stream.iterate( 0, i -> i++ )
              .limit(5)
              .forEach(System.out::print);
    }
}

 

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

選択肢

a. 01234と表示される

b. 12345と表示される

c. 00000と表示される

d. 44444と表示される

e. 55555と表示される

f. クラス名@hashcodeと表示される

g. コンパイルエラー

h. 実行時エラー

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

解答

 

c. 00000と表示される

 

解説

今回は Stream 型 の iterate() メソッドを利用している。

 

Stream 型の iterate() メソッドは 引数を2つ取る。第1引数に初期値(seed)、第2引数に適用する操作(関数 f )を取る。第2引数の関数 f は、UnaryOperatorインタフェースを実装したオブジェクトを引数にする。

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

「初期要素seedに関数fを繰り返し適用することで生成される、順序付けされた無限順次Streamを返します(seed、f(seed)、f(f(seed))、といった要素から成るStreamが生成される)。」

 

今回の場合、初期値は 0 が指定されている。操作は、「 i -> i++ 」となっている。これは、数値 i に対して、インクリメントを行うという操作になっている。

一見すると、0 が初期値で 1ずつ数値が増えるため、 01234 となるように思えるが、操作のインクリメントが「 i++ 」となっている。そのため、操作が終わった後に i にインクリメントがかかることになる。操作前の値は 0 のまま、変更されない。

 

以上から、00000となる。

もし、01234としたい場合は、「 i++ 」ではなく「 ++i 」とする。

 

Stream API の利用時にはラムダ式やメソッド参照、Optional 型や OptionalInt 型といった、Java 7 以前の環境にはなかったクラスや書き方が使用可能となっている。

設計や実装時には十分に注意する必要がある。


 <<前回の問題はこちら  |  第1問はこちら  |  次の問題はcoming soon 


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

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

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

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

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

PAGE TOP