Java 8 に入る前に いまさらながら Java 7 をかけ足でおさらい

Java 8 がリリースされた直後の喧噪も落ち着きつつありますが、実際のところ仕事ではまだJava6を使っているため、あまり話について行けていません。

おもしろそうだし、そろそろ触ってみよう。と思ったのですが、ラムダ式や、Stream APIもいいけど、その前に、Java 7 まともに把握していないことに気づいた。。。

ので、かけ足でJava7の概要だけなめておこう。

Java8のSJC-P、じゃなない、OJCP が出たら更新しよう。

ということで、参照したKindle本。

なんと、0円(英語)。

Java 7 で新しくなった個所が端的にまとまっている。 …はずと信じています。

まぁ、大枠わかればよいので。

では、サンプルコードを書きながら確認。結局手を動かさないと、自分のものにならないんだよな。

自動リソース管理

リソースの管理が大分楽になっています。

  • リソースのclose を自分で行う必要がありません。
  • ; で複数のリソースを同時に管理できます。
  • close() メソッドのみをもつCloseable インターフェースの子である、java.lang.AutoCloseable インターフェースを実装している必要があります。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
 
public class AutomaticResourceManagement {
    public static void main(String[] args) {
        
        try (BufferedReader reader 
                = new BufferedReader(new FileReader(new File("/home/piroto/work/test.txt")));
              BufferedWriter writer
                = new BufferedWriter(new FileWriter(new File("/home/piroto/work/out.txt")))
                ) {
    
            String line = null;
            while((line = reader.readLine()) != null) {
                writer.write(line);
                writer.write("\n");
            }
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

ダイヤモンド演算子

ジェネリックス型の宣言は、いままで、

Map<string ,INTEGER> numMap = new HashMap<string , Integer>();

こんな感じでしたが、<>(ダイアモンド演算子) を利用することで、すべての型リストを書く必要がなくなっています。

import java.util.HashMap;
import java.util.Map;
 
public class DiamondOperator {
    public static void main(String[] args) {
        Map<String,Integer> numMap = new HashMap<>();
    }
}

例外処理

| 演算子で、複数の例外をキャッチできる様になっています。

import java.io.FileNotFoundException;
import java.nio.file.FileAlreadyExistsException;
 
 
public class ExceptionHandling {
    public static void main(String[] args) {
 
        try {
            doSomethingWithMultiException();
        } catch (FileAlreadyExistsException | FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    private static void doSomethingWithMultiException() 
            throws FileNotFoundException, FileAlreadyExistsException {
    }
}

数値リテラル

  • 数字リテラル _ を入れられる(値としては無視される)
  • 0bで二進リテラルを記述できます。
public class NumericLiteralWIthUnderScore {
    
    public static void main(String[] args){
        
        final int million = 1_000_000;
        final int binary = 0b101;
        
        System.out.println(million);
        System.out.println(binary);
    }
}

文字列でswitch

文字列でswitch 構文を使えるようになっています。case ラベルでは、equals() で判定されます。

public class StringSwitch {
   public static void main(String[] args) {
       
       String[] status = {"new","old","New","Old"};
       int idx = (int)(Math.random()*10d % status.length);
       
       switch (status[idx]) {
       case "new":
           System.out.println("new:" + status[idx]);
           break;
       case "old":
           System.out.println("old:" + status[idx]);
           break;
       default:
           System.out.println("other:" + status[idx]);
           break;
       }
   }
}

Pathとか

*http://docs.oracle.com/javase/jp/7/api/

ファイルシステム内のファイルを特定するために使用可能。java.io.File と同等。追加機能を持つ

import java.nio.file.Path;
import java.nio.file.Paths;
 
public class WorkingWitPath {
 
    public static void main(String[] args) {
        
        Path path = Paths.get("/home");
        Path source = path.resolve("piroto/work/test.txt");
        System.out.println(source);
        
        Path dist = source.resolveSibling("out.txt");
        System.out.println(dist);
    }
}

ファイルやディレクトリの変更を検知

以下の手順で、ファイルやディレクトリの変更を検知できる

  • WatchService の作成。このサービスはWatchKeyへのキューからなる
  • WatchService でモニターしたいディレクトリ、ファイルを登録
  • イベントをリッスンするループの開始
  • イベントが発生すると、WatchKey がキューに入れられる
  • WatchKeyを消費し、問い合わせを実行
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchEvent.Kind;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
 
public class FileChangeNotifications {
 
    public static void main(String[] args) {
        try {
            WatchService watchService = FileSystems.getDefault().newWatchService();
            Path watchDir = Paths.get("/home/piroto/work");
            watchDir.register(watchService, 
                    StandardWatchEventKinds.ENTRY_CREATE,
                    StandardWatchEventKinds.ENTRY_MODIFY,
                    StandardWatchEventKinds.ENTRY_DELETE);
            while(true) {
                WatchKey watchKey = watchService.take();
                for (WatchEvent<?> event : watchKey.pollEvents()) {
                    Kind<?> kind = event.kind();
                    System.out.println(event.context().toString() + " is " + kind);
                }
            }
        
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

並行プログラミング

マルチプロセッサーで有利になる、フォーク/ジョイン フレームワーク実装

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
 
public class ForkAndJoin {
    public static void main(String[] args) {
        try {
            // n番目のフィボナッチ数を求める
            Fibonacci fnc = new Fibonacci(15);
            ForkJoinPool pool = new ForkJoinPool();
            pool.invoke(fnc);
            
            System.out.println("RESULT:" + fnc.get());
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}
/**
 * @see http://docs.oracle.com/javase/jp/7/api/java/util/concurrent/RecursiveTask.html
 */
class Fibonacci extends RecursiveTask {
    final int n;
 
    public Fibonacci(int n) {
        System.out.println(this.toString());
        this.n = n;
    }
 
    @Override
    protected Integer compute() {
            if (n <= 1) {
                return n;
            }
            Fibonacci f1 = new Fibonacci(n - 1);
            f1.fork();
            Fibonacci f2 = new Fibonacci(n - 2);
            return f2.compute() + f1.join();
    }
}

大きくはそんなところか?

あと、このへんかな。

http://docs.oracle.com/javase/7/docs/webnotes/adoptionGuide/index.html

そのうち、Java 8 試してみよう。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です