( 本記事の目次 )
模擬問題に挑戦!
では、今回解説したことの理解度を確認するため、3問の模擬問題に挑戦してみましょう。
問題1
以下コードの実行結果が[RED, BLUE, GREEN]と出力されるには、[①]に挿入するコードとして正しい解答はどれですか?
import java.util.*; public class Sample7 { public static void main(String[] args) { List<String> color = Arrays.asList("red", "blue", "green"); [ ① ] System.out.println(color); } }
- A. for(String s : color) { color = s.toUpperCase(); }
- B. color.replaceAll((String s) -> {return s.toUpperCase();});
- C. color.replaceAll(s -> toUpperCase());
- D. for(int i = 0 ; i < color.size(); i++) { color[i].toUpperCase(); }
選択肢A、Dはともにコンパイルエラーです。選択肢Cは(s -> toUpperCase())
が(s -> s.toUpperCase())
となっていればコンパイル、実行ともに成功し、実行結果は[RED, BLUE, GREEN]
となります。
〔正解:B〕
問題2
以下のコードを、コンパイル、実行した場合、正しい解答はどれですか?
import java.util.*; public class Sample8 { public static void main(String[] args) { String[] ary = {"tokyo", "nagasaki", "mie", "nara"}; List<String> city = Arrays.asList(ary); if(city.removeIf(str -> str.length() <=3)) { System.out.println(city); } } }
- A. 「[tokyo, nagasaki, nara]」が出力される
- B. 「[tokyo, nagasaki]」が出力される
- C. コンパイルエラーとなる
- D. 実行時エラーとなる
6行目では、5行目で作成した配列をもとにリストを作成していますが、これは固定リストです。したがって、7行目で固定リストに対し削除を試みるため、実行時にUnsupportedOperationException
例外が発生します。6行目を次のように変更すると可変リストとして扱われ、7行目で各要素内にある文字列の文字数が3以下の要素のみ削除します。したがって、実行結果は[tokyo, nagasaki, nara]
となります。
(現行) 6. List<String> city = Arrays.asList(ary); (変更後) 6. List<String> city = new ArrayList<>(Arrays.asList(ary));
〔正解:D〕
問題3
以下コードでは、12行目のmethod()メソッドが実行されたら、「30」と出力したいと考えています。[ ① ]に挿入するコードとして正しい解答はどれですか?
import java.util.*; import java.util.function.*; public class Sample9 { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); list.add(new Integer(10)); list.add(new Integer(20)); list.add(new Integer(30)); method(list, [ ① ]); } static void method(List<Integer> list, Predicate<Integer> op) { for(Integer val : list) { if(op.test(val)) { System.out.println(val); } } } }
- A. list.get(i) > 20
- B. (int val) -> {return val > 20;}
- C. val -> val > 20
- D. val > 20
問題文、選択肢から、リストの要素が20を超えるものを出力する必要があります。
12行目のmethod()
メソッドの第2引数は、関数型インタフェースPredicate
のラムダ式を受け取ります。Predicate
インタフェースは抽象メソッドboolean test(T t)
を持つので、[ ① ]には、その実装を指定する必要があります。
正解は選択肢Cです。それ以外はすべてコンパイルエラーになりますが、選択肢Bは確認しておきましょう。
選択肢Bでは、->
の左辺が(int val)
となっていますが、Predicate
インタフェースのtest()
メソッドの引数がとるのは参照型です。12行目のmethod()
メソッドの第2引数もPredicate<Integer>
型で宣言されているため、プリミティブ型である(int val)
ではコンパイルエラーとなります。もし(int val)
を(Integer val)
としていれば、選択肢Cと同様の結果を得ることができます。
〔正解:C〕
本記事では2回にわたって、Silver SE 8試験での変更点を解説しました。Java SE 8の新機能であり、Silver SE 8試験の新トピックとなったDate and Time APIとラムダ式を解説しましたが、本記事で取り上げたのは仕様のごく一部です。ぜひ、この機会に仕様書をひととおりチェックしていただければと思います。特にラムダ式は、今後のJavaアプリケーション開発で多用されるでしょうから、まさに今! 習得しましょう。