JDK8で変わる
Javaプログラミング
13年8月9日金曜日
アジェンダ
• JDK8を使う準備
• JDK8の新機能
・Lambda式
・メソッド参照
・標準メソッド
・新しいDate and Time API
• まとめ
13年8月9日金曜日
JDK8を使う準備
13年8月9日金曜日
JDK8のインストール
• JDK8 Early Access Releasesを下記URLより
ダウンロードしてインストール
http://jdk8.java.net/download.html
13年8月9日金曜日
JDK8の確認
$ java -version
java version "1.8.0-ea"
Java(TM) SE Runtime Environment (build 1.8.0-ea-b100)
Java HotSpot(TM) 64-...
IntelliJ IDEAのインストール
• IntelliJ IDEA Community EditionをDL
http://www.jetbrains.com/idea/download/
index.html
13年8月9日金曜日
IntelliJの設定
• File>Project StructureでSKDを1.8、言語
レベルを8.0に設定
13年8月9日金曜日
JDK8の新機能
13年8月9日金曜日
Lambda式
13年8月9日金曜日
匿名クラス
List<Integer> numbers = Arrays.asList(7, 3, 5);
Collections.sort(numbers, new Comparator<Integer>() {
@Override
publ...
匿名クラスの問題点
• 実装クラスがシンプルな場合、匿名ク
ラスは機能が大きすぎる
• メソッドの引数に、匿名クラスではな
くメソッド自体を渡したい
13年8月9日金曜日
Lambda式
• 単一メソッドからなるインターフェース
を実装する匿名クラスを、簡潔に記述
する仕組み
13年8月9日金曜日
Lambda式
List<Integer> numbers = Arrays.asList(7, 3, 5);
Collections.sort(numbers, (o1, o2) -> o1 % 5 - o2 % 5);
new Compar...
Lambda構文
• コンマ区切りの引数リスト(a, b)
• 矢印「 ->」
• 1行の式、もしくはブロックステート
メント{}からなるボディ
13年8月9日金曜日
public class LambdaSample {
public static void main(String[] args) {
Calculator sum = (n, m) -> n + m;
operate(3, 2, sum);...
関数インタフェース
• 1つメソッドからなるインタフェース
• Lambda式が利用できる
• java.util.functionパッケージに標準の関数
インタフェースが存在
13年8月9日金曜日
メソッド参照
13年8月9日金曜日
メソッド参照とは
• 既存のメソッドを名前で参照して
利用するためのLambda式の仕組み
13年8月9日金曜日
public interface Calculator {
int calculate(int n, int m);
}
public class Sample {
public static void main(String[] args) ...
参照の種類
• スタティックメソッド「クラス名::メ
ソッド名」
• インスタンスメソッド「インスタンス
名::メソッド名」
• コンストラクタ「クラス名::new」
13年8月9日金曜日
標準メソッド
13年8月9日金曜日
インタフェースの問題点
• インタフェースの実装クラスが、インター
フェースの全てのメソッドを実装しなけれ
ばならないという制約のため、
既存のインターフェースを拡張できない
13年8月9日金曜日
public interface SimpleInterface {
void doWork();
}
public class SimpleInterfaceImpl implements SimpleInterface {
@Overrid...
public interface SimpleInterface {
public void doWork();
public void doOtherWork();
}
public class SimpleInterfaceImpl imp...
標準メソッド
• 実装クラスの制約を受けずに、イン
ターフェースを拡張可能にする仕組み
• インターフェースに実装する
• 実装クラスが実装する必要がない
13年8月9日金曜日
public class SimpleInterfaceImpl implements SimpleInterface {
@Override
public void doWork() {
System.out.println("doWork ...
新しいDate and Time API
13年8月9日金曜日
従来の日時APIの問題点
• インスタンスが可変(mutable)である
• 煩雑で分かりにくAPI
13年8月9日金曜日
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar now = Calendar.getInstance();
System.out.println(df....
新しいDate And Time API
• Joda-Time Libraryに影響を受け、新し
く作り直した日時API
• 理解しやすい日時のモデル
• 不変(immutable)かつスレッドセーフな
クラスを提供
13年8月9日金曜日
LocalTime time = LocalTime.now();
System.out.printf("%s:%s:%sn"
, time.getHour(), time.getMinute(), time.getSecond());
// ...
LocalDate date = LocalDate.now();
System.out.printf("%s-%s-%sn", // => 2013-8-1
date.getYear(), date.getMonthValue(), date...
まとめ
13年8月9日金曜日
JDK8を使ってみて
• 一番のインパクトはやはりLambda式
• 型推論により良い意味でJavaっぽくない
• モジュール管理のプロジェクト
「Jigsaw」や、Javascript実装のプロジェ
クト「Nashorn」も気になる
13年8...
Upcoming SlideShare
Loading in...5
×

JDK8で変わるJavaプログラミング

4,843

Published on

Java8若手勉強会(2013/8/9)の資料

Published in: Technology, Education
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
4,843
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
7
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Transcript of "JDK8で変わるJavaプログラミング"

  1. 1. JDK8で変わる Javaプログラミング 13年8月9日金曜日
  2. 2. アジェンダ • JDK8を使う準備 • JDK8の新機能 ・Lambda式 ・メソッド参照 ・標準メソッド ・新しいDate and Time API • まとめ 13年8月9日金曜日
  3. 3. JDK8を使う準備 13年8月9日金曜日
  4. 4. JDK8のインストール • JDK8 Early Access Releasesを下記URLより ダウンロードしてインストール http://jdk8.java.net/download.html 13年8月9日金曜日
  5. 5. JDK8の確認 $ java -version java version "1.8.0-ea" Java(TM) SE Runtime Environment (build 1.8.0-ea-b100) Java HotSpot(TM) 64-Bit ServerVM (build 25.0-b42, mixed mode) 13年8月9日金曜日
  6. 6. IntelliJ IDEAのインストール • IntelliJ IDEA Community EditionをDL http://www.jetbrains.com/idea/download/ index.html 13年8月9日金曜日
  7. 7. IntelliJの設定 • File>Project StructureでSKDを1.8、言語 レベルを8.0に設定 13年8月9日金曜日
  8. 8. JDK8の新機能 13年8月9日金曜日
  9. 9. Lambda式 13年8月9日金曜日
  10. 10. 匿名クラス List<Integer> numbers = Arrays.asList(7, 3, 5); Collections.sort(numbers, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { int n = o1 % 5; int m = o2 % 5; return n - m; } }); 13年8月9日金曜日
  11. 11. 匿名クラスの問題点 • 実装クラスがシンプルな場合、匿名ク ラスは機能が大きすぎる • メソッドの引数に、匿名クラスではな くメソッド自体を渡したい 13年8月9日金曜日
  12. 12. Lambda式 • 単一メソッドからなるインターフェース を実装する匿名クラスを、簡潔に記述 する仕組み 13年8月9日金曜日
  13. 13. Lambda式 List<Integer> numbers = Arrays.asList(7, 3, 5); Collections.sort(numbers, (o1, o2) -> o1 % 5 - o2 % 5); new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { int n = o1 % 5; int m = o2 % 5; return n - m; } } 同値 13年8月9日金曜日
  14. 14. Lambda構文 • コンマ区切りの引数リスト(a, b) • 矢印「 ->」 • 1行の式、もしくはブロックステート メント{}からなるボディ 13年8月9日金曜日
  15. 15. public class LambdaSample { public static void main(String[] args) { Calculator sum = (n, m) -> n + m; operate(3, 2, sum); // => 5 Calculator diff = (n, m) -> { if (n >= m) { return n - m; } else { return m - n; } }; operate(3, 2, diff); // => 1 operate(3, 2, (n, m) -> n * m); // => 6 } public static void operate(int n, int m, Calculator c) { System.out.println(c.calculate(n, m)); } } public interface Calculator { int calculate (int n, int m); } 13年8月9日金曜日
  16. 16. 関数インタフェース • 1つメソッドからなるインタフェース • Lambda式が利用できる • java.util.functionパッケージに標準の関数 インタフェースが存在 13年8月9日金曜日
  17. 17. メソッド参照 13年8月9日金曜日
  18. 18. メソッド参照とは • 既存のメソッドを名前で参照して 利用するためのLambda式の仕組み 13年8月9日金曜日
  19. 19. public interface Calculator { int calculate(int n, int m); } public class Sample { public static void main(String[] args) { operate(6, 2, (n, m) -> n + m); // => 8 operate(6, 2, Sample::div); // => 3 } public static void operate(int n, int m, Calculator c) { System.out.println(c.calculate(n, m)); } public static int div(int o1, int o2) { return o1 / o2; } } 13年8月9日金曜日
  20. 20. 参照の種類 • スタティックメソッド「クラス名::メ ソッド名」 • インスタンスメソッド「インスタンス 名::メソッド名」 • コンストラクタ「クラス名::new」 13年8月9日金曜日
  21. 21. 標準メソッド 13年8月9日金曜日
  22. 22. インタフェースの問題点 • インタフェースの実装クラスが、インター フェースの全てのメソッドを実装しなけれ ばならないという制約のため、 既存のインターフェースを拡張できない 13年8月9日金曜日
  23. 23. public interface SimpleInterface { void doWork(); } public class SimpleInterfaceImpl implements SimpleInterface { @Override public void doWork() { System.out.println("do work"); } } 13年8月9日金曜日
  24. 24. public interface SimpleInterface { public void doWork(); public void doOtherWork(); } public class SimpleInterfaceImpl implements SimpleInterface { @Override public void doWork() { System.out.println("do work"); } } doOtherWork()を 実装していないため コンパイルエラー 13年8月9日金曜日
  25. 25. 標準メソッド • 実装クラスの制約を受けずに、イン ターフェースを拡張可能にする仕組み • インターフェースに実装する • 実装クラスが実装する必要がない 13年8月9日金曜日
  26. 26. public class SimpleInterfaceImpl implements SimpleInterface { @Override public void doWork() { System.out.println("doWork in implement class"); } public static void main(String[] args) { SimpleInterface impl = new SimpleInterfaceImpl(); impl.doWork(); // => doWork in implement class impl.doOtherWork(); // => doOtherWork in interface } } public interface SimpleInterface { public void doWork(); default public void doOtherWork() { System.out.println("doOtherWork in interface"); } } 13年8月9日金曜日
  27. 27. 新しいDate and Time API 13年8月9日金曜日
  28. 28. 従来の日時APIの問題点 • インスタンスが可変(mutable)である • 煩雑で分かりにくAPI 13年8月9日金曜日
  29. 29. DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar now = Calendar.getInstance(); System.out.println(df.format(now.getTime())); // => 2013-08-01 18:00:00 // 3時間後 now.add(Calendar.HOUR_OF_DAY, 3); System.out.println(df.format(now.getTime())); // => 2013-08-01 19:00:00 // mutable!!! 13年8月9日金曜日
  30. 30. 新しいDate And Time API • Joda-Time Libraryに影響を受け、新し く作り直した日時API • 理解しやすい日時のモデル • 不変(immutable)かつスレッドセーフな クラスを提供 13年8月9日金曜日
  31. 31. LocalTime time = LocalTime.now(); System.out.printf("%s:%s:%sn" , time.getHour(), time.getMinute(), time.getSecond()); // => 18:00:00 LocalTime timeAfter3Hours = time.plus(3, ChronoUnit.HOURS); System.out.printf("%s:%s:%sn" , timeAfter3Hours.getHour() , timeAfter3Hours.getMinute() , timeAfter3Hours.getSecond()); // => 21:00:00 System.out.printf("%s:%s:%sn" , time.getHour(), time.getMinute(), time.getSecond()); // => 18:00:00 // immutable!! 13年8月9日金曜日
  32. 32. LocalDate date = LocalDate.now(); System.out.printf("%s-%s-%sn", // => 2013-8-1 date.getYear(), date.getMonthValue(), date.getDayOfMonth()); Period p = Period.of(1, 2, 10); // 1year, 2month, 10day LocalDate date2 = date.plus(p); System.out.printf("%s-%s-%sn", // => 2014-10-11 date2.getYear() , date2.getMonthValue() , date2.getDayOfMonth()); 13年8月9日金曜日
  33. 33. まとめ 13年8月9日金曜日
  34. 34. JDK8を使ってみて • 一番のインパクトはやはりLambda式 • 型推論により良い意味でJavaっぽくない • モジュール管理のプロジェクト 「Jigsaw」や、Javascript実装のプロジェ クト「Nashorn」も気になる 13年8月9日金曜日
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×