JDK7のプレビュー版が出たので早速触ってみた

ということで、JDK7のプレビュー版を触ってみた・・・
けど、そもそもJDK7にどんな機能があったのがかなり忘れていたので(^^;;
(LambdaもJigsawもJDK 8だったよな・・・)
skrbさんのProject Coinの部分を丸コピーで(汗


まずは簡単なところからダイヤモンド記法。
Genericsの<>の中をnewの部分は省略できるというもの。

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

特にこれといったものは無いですね(^^;;


続いては数値のリテラル記法の追加。
数値を表すとき"_"で区切りを入れられるようになりました。
例えば"10000"を次のように書くことが可能。

       for (int i= 0; i<10_000; i++){
           list.add(i);
       }
       System.out.println(list.size());


このとき次のように実行されます。

10000
構築成功 (合計時間: 0 秒)


これだけだと、へーって感じですが、
次のようにやってみてもエラーとなりません。

       for (int i= 0; i<1_0_0_0_0; i++){
           list.add(i);
       }
       System.out.println(list.size());

しかも実行結果が一緒です。

10000
構築成功 (合計時間: 0 秒)

これに関しては古いシステムとか
数値を"_"でくっつけて扱っているシステムとか
あるんじゃないかなという気がしていて
意外にバグの温床になるんじゃないかなと思ってたりします。


次はcase文でStringが使えるようになった点。
こんなことができるようになりました。

       String str = "str";

       switch(str){
           case "Str":
               System.out.println("Str");
               break;
           case "str":
               System.out.println("str");
               break;
       }

実行結果はこんな感じ。

str
構築成功 (合計時間: 0 秒)

これは、意外に使いどころが難しいような気がします。


次はcatch文でのマルチキャッチ。
複数の例外を同じ場所でcatchできるようになりました。

       try{
               ・・・

       }catch(NullPointerException | ArrayIndexOutOfBoundsException e){
               ・・・
       }

catchの括弧の中が長くなるのが欠点ですが、地味に使えるかも。



最後はストリームを自動的にcloseしてくれる書き方。
次の書き方をするとfinally句でcloseしなくても
自動的にcloseしてくれるようです。

       try (InputStream in = new FileInputStream("C:\\test.txt");
            OutputStream out = new FileOutputStream("C:\\testA.txt")) {

           byte[] buf = new byte[1024];
           int n;

           while((n = in.read(buf)) >= 0) {
               out.write(buf, 0, n);
           }
       } catch (IOException ex) {
           ex.printStackTrace();
       }

ちょっと特殊な書き方をしないとcloseしてくれないのか。
この場合、当たり前ですけど、
in、outのスコープはtry句の中だけになりますが、
意外にすっとぼけて微妙にはまりそうな気がちょっとします。
(私のことです・・・Javaを最近触っていなかったからなあ・・・)


他にも機能があるのですが、それはまた機会があればということで。
(というか調べている余裕が・・・)


P.S.
これらの実行はほとんどRuby専用機となっていたNetBeansで試したのですが、
最近のNetBeansはprintStackTraceを書いたら怒られるんですね。
知りませんでした・・・。