まず初めに
3部構成で読んでいただきたい。
理由としては、ただ単にスクロールが面倒なのと記事ごとで書いている内容を差別化させたいからだ。
ソースコードは自分の環境にてコンパイルをかけていますが、万が一、誤りなどある場合はご指摘ください。
前編(本や受験に際しての注意事項)へ
後編(おそらく筆者の間違えた問題)へ
※後編は20200612時点では完成していません。これから記載する予定です。
本章では以下を主要トピックとして扱う
・試験に際して、覚えといたほうがいいこと
【試験に際して、覚えといたほうがいいこと】
①ポリモフィズム系
instanceof演算子について
instanceof演算子は、インスタンス化された変数の参照範囲がどこまでかを見ているという認識。
参照範囲として見れている場合は、true
が返る。逆に参照範囲ではないが、オブジェクトのサブタイプ(サブクラス)に当たる場合はfalseを返す。
要はダウンキャストができるかできないかが問題の焦点になるだろう。
Hoge1~Hoge3については継承関係にあるため、Hoge2でオブジェクトを作っても下記のようにダウンキャストできるものはfalseで返る。
class Hoge1 {}
class Hoge2 extends Hoge1 {}
class Hoge3 extends Hoge2 {}
class Hoge4
Hoge2 hoge2 = new Hoge2();
// true
System.out.println(hoge2 instanceof Hoge1);
// true
System.out.println(hoge2 instanceof Hoge2);
// false
System.out.println(hoge2 instanceof Hoge3);
// コンパイルエラー
System.out.println(hoge2 instanceof Hoge4);
// できる
Hoge3 hoge3 = (Hoge3) hoge2;
// できない
Hoge4 hoge4 = (Hoge3) hoge2;
②クラス系
クラス修飾子について
・おおもとに定義されたクラス(一番外側のクラス)はpublic修飾子を付けてもつけなくてもコンパイル通る
・staticやprivate修飾子についてはインナーとしては修飾可能
・staticクラス内ではメンバ変数、static変数の共に修飾可能
・staticクラス内ではstaticメソッドは修飾可能
・finalはクラスにでも修飾は可能だが、その先でそのクラスの継承はできない
HogeHoge.java
public class HogeHoge{
public static void main(String[] args) throws Exception {
int num = new HogeHoge.hogeStatic().teisuuA;
}
static class hogeStatic {
static final int teisuuA;
static {
teisuuA = 6;
}
static int memBerNum = 0;
public static void doIt() {
return;
}
private class hogeStaticInPrivate {
}
// コンパイルエラー
public void abcdefg{}
}
}
③関数型インタフェース
アノテーション(FunctionalInterface)について
・このアノテーションを付けることによって事前にコンパイルエラーかどうかチェックしてくれる
・ちなみにこれをつけずにhogeI1ToString2()
を定義するとエラーは返らない。
具象メソッドについて
・Java SE8からdefaultメソッドの定義が可能になった。
@FunctionalInterface
interface HogeI1 {
public String toString();
public String hogeI1ToString();
// コンパイルエラー
public String hogeI1ToString2();
public default void SSS(Integer x, String y) {}
}
④ストリームAPI
配列からStreamオブジェクトを作る場合
Arrays.stream()を使う。
実行モードについて
・parallelStream()
collectionインタフェースに定義されている、並列ストリームを返すメソッド
・parallel()
BaseStreamインタフェースに定義されている、並列ストリームを返すメソッド
・sequential()
BaseStreamインタフェースに定義されている、順次ストリームを返すメソッド
中間操作
・map
Stream返す認識。今回だと、Stream -> Stream
・peek
デバック用と思ってください。引数はConsumer<? super T>
です
終端操作(中間操作で成形したデータを動かすために必要)
・reduce(BinaryOperator accumulator)
下記の当該コードはこれ。
Optionalを返す。get()で取得可能。
・reduce(T identity, BinaryOperator accumulator)
第1引数のTが返る。
System.out.println(
Arrays.asList("java", "php", "Ruby").parallelStream()
.parallel()
.sequential()
.map(st -> st.length())
.peek(System.out::println)
.reduce((s15, s25) -> s15 + s25)
.get()
);
実行結果は3 4 4 11と改行されて出力されるが、もし.sequential()を書かなかった場合は
【3 4 4】が【4 3 4】になったり順番が一定ではなくなる。
⑤感覚的に覚えたこと(抽象的な表現ですいません)
主にややこしいところは暗記しました。
FileクラスとFilesクラス
・FileクラスではisXXXメソッドでは引数取りません。
・new File("").toPath()の形式
でPathオブジェクトを生成する
・Filesクラス提供のメソッドはすべて引数を取ります
→isDirectoryメソッドとか頻出ですがこれ覚えとくだけで事前にコンパイルエラーかわかるようになった
・Filesクラスのwalk()は再帰的にパス情報を取ってくる。
・Filesクラスのfind()の引数の順番は覚えたほうが良い。
getDefault、SystemDefault系
・getDefaultは、FileSystemsクラス, Localeクラスにある
・SystemDefaultはZoneIdクラスにある
主要関数型インタフェースの取得方法
事前に返ってくる型が分かっていれば、その型を指定する。
通常パターン
・Function<T, R>, XXXFunction :apply()
・Supplier<T>:get()
・Consumer<T>, XXXConsumer :accept()
・Predicate<T>, XXXPredicate :test()
特殊パターン
・ToXXXFuntion<T>:applyAsXXX()
ToIntならapplyAsInt()のような感じ。
XXXSupplierの形だけ注意!
IntSupplier, DoubleSupplier, LongSupplier:getAsXXX()
以上。
もっとたくさん覚えたし共有したいけど、時間がない。。。
どんどん追記していこうと思ってます(震え声)