連休だしJavaコレクションの歴史を振り返ってみる


※実用的な内容は一切含まれておりません。「あの頃はあんなプロジェクトやってたなぁ~」と懐かしみたいときにお読み下さい。

# JDK 1.0（1996年1月23日）

当初はVector/Hashtablen等の実装クラスしか無く、List/Map等のインターフェイスは存在しなかった。

反復処理にはEnumerationインターフェイスを使用するが、あまり使いやすいものでもないのでVectorの場合はfor文でインデックス指定で要素を取得するほうが一般的だったと思う。

```java:
        Vector list = new Vector();
        list.add(new Integer(9));
        list.add(new Integer(3));
        list.add(new Integer(4));

        Enumeration e = list.elements();
        while (e.hasMoreElements()) {
            Integer val = (Integer) e.nextElement();
            System.out.println(val);
        }

        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.elementAt(i));
        }
```

# J2SE 1.2（1998年12月8日）

コレクションフレームワークが導入され、List/Map等のインターフェイスとArrayList/TreeMap等の実装クラスが提供されるという、いかにもJavaらしいAPIに変化した。
この頃から「インターフェイスに対してプログラムせよ」と盛んに言われるようになった。

反復処理にはIteratorインターフェイスを使うが、使い勝手はEnumerationと同じなので相変わらずfor文でインデックスを使うほうが多かった。

```java
        List list = new ArrayList();
        list.add(new Integer(9));
        list.add(new Integer(3));
        list.add(new Integer(4));

        Iterator itr = list.iterator();
        while (itr.hasNext()) {
            Integer val = (Integer) itr.next();
            System.out.println(val);
        }

        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
```

オブジェクトの順序付けを行うComparatorインターフェイスも追加され、リストのソートは以下のように書けるようになった。

```java
        Collections.sort(list, new Comparator() {
            public int compare(Object o1, Object o2) {
                return ((Integer) o1).compareTo((Integer) o2);
            }
        });
```



# J2SE 5.0（2004年9月30日）

総称型、拡張for文、オートボクシングが導入され、コレクションの処理が劇的に書きやすくなった。
特別な理由がない限りはIteratorやfor文でインデックスを使う書き方はほぼ使わなくなる。

```java
        List<Integer> list = new ArrayList<Integer>();
        list.add(9);
        list.add(3);
        list.add(4);
        for (int val : list) {
            System.out.println(val);
        }
```

Arrays.asList()のシグネチャも```List asList(Object[] a) ```から総称型と可変長引数を使った```<T> List<T> asList(T... a) ```に変更され、Listの初期化で使えるようになった。

```java
        List<Integer> list = Arrays.asList(9, 3, 4);
```

# Java SE 7（2011年7月28日）

インスタンス作成時にダイアモンド演算子で型引数を省略できるようになった。
が、Eclipseを使っているとコード補完で型引数が記述されるのでこれを手作業で削除するという無駄な作業が。。。

```java
        List<Integer> list = new ArrayList<>();
```

# Java SE 8（2014年3月18日）

ラムダ式、メソッド参照、StreamAPI等が導入され、コレクションの処理が更に書きやすくなった。
for文を使う機会はかなり減ったと思う。

```java:ラムダ式
        List<Integer> list = Arrays.asList(9, 3, 4);
        list.forEach(val -> System.out.println(val));
```
```java:メソッド参照
        List<Integer> list = Arrays.asList(9, 3, 4);
        list.forEach(System.out::println);
```
```java:StreamAPI
        IntStream.rangeClosed(1, 10)
            .filter(x -> x % 3 == 0)
            .map(x -> x * 2)
            .sum();
```
ソートはListインターフェイスにsort()が追加されたので、Collections.sort()を使わずに以下のように書けるようになった。
(内部ではデフォルト実装でCollections.sort()を呼ぶようになっている)

```java:ソート
        list.sort((x, y) -> {return x - y;});
```

<ins>[2014/11/02] 追記</ins>
さらにComparatorに追加されたメソッドを使う事で複雑な比較処理でも宣言的に構築できるようになった。

```java:Comparatorのメソッドを使ってソート
        persons.sort(Comparator.comparing(
                Person::getLastName, Comparator.reverseOrder()));
```

# 参考

[Java SE API & ドキュメント](http://www.oracle.com/technetwork/jp/java/javase/documentation/api-jsp-316041-ja.html)
[Wikipedia - Java](http://ja.wikipedia.org/wiki/Java)
[ひしだま's 技術メモページ - Java新機能](http://www.ne.jp/asahi/hishidama/home/tech/java/uptodate.html)