7,292 バイト追加
、 2020年2月15日 (土) 07:33
==Java SE 7==
[Java][SJC-P]
{{amazon|B005XSS8VC}}
===自動リソース管理===
*close を手動で行う必要がない
*; で複数のリソースを同時に管理
*java.lang.AutoCloseable インターフェースを実装する必要あり
*AutoCloseable は close() のみを持つ Closeable インターフェースの子
=====例=====
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>();
====<> (ダイアモンドオペレーター) シンボルを利用することで、すべての型リストを書く必要はない====
new hashmap() だと、これまで通りコンパイラはタイプセーフ警告を発する
=====例=====
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===
*case ラベルでは、String.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===
*Pathはファイルパスへの簡易な参照
*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();
}
}
}
===フォークとジョイン===
*fork/join フレームワークは、ExecuterServiceインターフェースの実装
*複数のプロセッサーがある場合に有利
=====例=====
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<Integer> {
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();
}
}
=====結果=====
info.typea.javase7.nio.Fibonacci@6ab41dbb
info.typea.javase7.nio.Fibonacci@570c16b7
info.typea.javase7.nio.Fibonacci@22fdffb1
:
info.typea.javase7.nio.Fibonacci@519dcf69
info.typea.javase7.nio.Fibonacci@4f9c205b
info.typea.javase7.nio.Fibonacci@13105f32
RESULT:610