JavaGoldSE8に受かったので(後編)

# まず初めに
3部構成で読んでいただきたい。
理由としては、ただ単にスクロールが面倒なのと記事ごとで書いている内容を差別化させたいからだ。

**ソースコードは自分の環境にてコンパイルをかけていますが、万が一、誤りなどある場合はご指摘ください。**

[前編(本や受験に際しての注意事項)へ](https://qiita.com/Zombie_PG/items/7f1aec26d32dd154762b)
[中編(試験に際して、覚えといたほうがいいこと)へ](https://qiita.com/Zombie_PG/items/6d0ee864157fa7ab23ed)

本章では以下を主要トピックとして扱う
・おそらく筆者が間違えた問題
(黒本を参考にしています)


# 【おそらく筆者が間違えた問題】
答えを予想しながら読んでみてください。

## ①ラムダ式と関数型インタフェース

### BiFunction<T, U R>について
これの答えはどれ
①実行時エラー
②5.4
③コンパイルエラー

```Java
        BiFunction<Integer, Double, Integer> func = (f, f2) -> {
            return f + f2;
        };
        System.out.println(func.apply(2, 3.4));
```

答え↓
③です。`BiFunction<Integer, Double, Double>`にすれば②が答えになります。
暗黙的にキャストはしてくれないってことですね。

ちなみに`BiFunction<Integer, Integer, Double>`と`BiFunction<Double, Double, Integer>`もコンパイルエラーになります。

### メソッド参照について
これの答えはどれ
①実行時エラー
②3
③コンパイルエラー
④何も表示されない

```Java
        Function<String, Integer> f2 = String::length;
        f2.apply("Run");
```

答え↓
④です。`System.out.println(f2.apply("Run"));`にすれば②が答えになります。
メソッド参照についての問題です。
Function<T, R>、Predicate<T>などの関数型インタフェースでセットとして出てくることが多い印象です。
メソッド参照を使わない場合は`str -> str.length()`のような形で記述ができます。
余談になりますが、出力するメソッドを使わずに引っ掛ける問題も本番は出る可能性が高めです。

### アノテーション(FunctionalInterface)について

これの答えはどれ
①default定義の箇所でコンパイルエラー
②①以外の箇所でコンパイルエラー
③実行時エラー


```java
@FunctionalInterface
interface HogeI1 {
    public String toString();

    public String hogeI1ToString();

    public String hogeI1ToString2();

    public default void SSS(Integer x, String y) {}
}
```

答え↓
②です。`interface HogeI1 { `ここでコンパイルエラーが起きます。
抽象メソッドを2個目定義したから。

**具象メソッドについて**
・Java SE8からdefaultメソッドの定義が可能になった。

**アノテーション(FunctionalInterface)について**
・このアノテーションを付けることによって事前にコンパイルエラーかどうかチェックしてくれる
・`public String hogeI1ToString2();`または`public String hogeI1ToString();`をコメントアウトするとコンパイルが通る
・これをつけずに`hogeI1ToString2()`を定義するとエラーは返らない


## ②StreamAPI系

これの答えはどれ
①実行時エラー
②false
③コンパイルエラー
④true

```java
        Optional<Integer> opt = Arrays.asList(1, 2, 3).stream()
            .map((n) -> n * 2)
            .allMatch(f1 -> f1 > 2);
        System.out.println(opt);
```

答え↓
③です。変数定義時に`boolean`で定義しておけば、コンパイルは成功し`false`(②)が出力されます。
記憶にある限りですが、結果として受け取る型でひっかけてくる系も出てきます。
戻り値とセットで覚えましょう！

**終端操作におけるfindXXX,XXXMatchについて**
・findXXXの戻り値は`Optional`
・XXXMatchの戻り値は`boolean`
です。

## ③例外系

これの答えはどれ
①コンパイルエラー
②コンパイル成功

```java
        try{
            throw new SQLException ();
        } catch(SQLException e){
            e = new SQLException();
        }
```

答え↓
②です。
マルチキャッチではなく、普通の`catch`ブロックであればコンパイルは通ります。
`catch(Exception | SQLException e){`
の場合は、このcatchブロック自体が継承関係あるためコンパイルエラーです。
`} catch(IOException | SQLException e){`
の場合は`catch`ブロック自体ではコンパイルエラーは起きませんが、マルチキャッチを行うと定義された変数は暗黙でFinal修飾子がつくため、下の代入にてエラーが起きます。



# 最後に
筆者の感想ですが、「interfaceを定義し、その中で変数を定義したら暗黙的にどうなるか」とか、「Enumクラスのコンストラクタはprivate定義」だよねとか暗記でいいところは暗記したほうが確実に点を取れるかなと思います。
Silverはほとんど暗記でいけたけど、実務経験ない状態からGoldを受けようとすると書籍を読み進めるだけでは限界があると思うので自宅に環境立てちゃった方が早いです！
**みなさんの合格を祈願します。**

**以上。**

[前編(本や受験に際しての注意事項)へ](https://qiita.com/Zombie_PG/items/7f1aec26d32dd154762b)
[中編(試験に際して、覚えといたほうがいいこと)へ](https://qiita.com/Zombie_PG/items/6d0ee864157fa7ab23ed)

# 参考書籍
[黒本](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-Java-Gold-%E5%95%8F%E9%A1%8C%E9%9B%86-1Z0-809/dp/4295000035)
ISBNコード：978-4-295-00003-7

[紫本](https://www.amazon.co.jp/%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8-Java%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E-Gold-SE-EXAMPRESS/dp/479814682X)
ISBNコード：978-4-7981-4682-9

[白本](https://www.amazon.co.jp/%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8-Java%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E-Gold-SE-%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E5%95%8F%E9%A1%8C%E9%9B%86/dp/4798146811)
ISBNコード：978-4-7981-4681-2