Share
Embed
JavaOne 2022 報告会(パターンマッチングとString Templatesの話)
Sugiyama Takaaki
November 11, 2022
Transcript
45 slides
-
2022年のJavaOne •Oracle Cloud World との併催 •開催期間:10月18日から20日(3日間) •開催場所:ラスベガス(シーザーズ・フォーラム) •セッション数:142セッション •キーノート: 3 •通常セッション: 92
•ライトニング・セッション: 22 •ハンズオンラボ: 10 •BOF: 8 •ハッカソン: 7 •一部セッションはオンライン配信あり -
私が参加したセッション • Data Parallel Programming in Java Using the Vector
API • Pattern Matching in Java 19 • Secure Coding Guidelines for Java SE • Collections Connection Rebooted • Project Wakefield: A New Wayland Desktop for Java on Linux • To Production and Beyond: Metrics with Micrometer • Accelerating Java on the GPU • Pattern Matching: Past, Present, and Future • Project Loom: Modern Scalable Concurrency for the Java Platform • Data-Oriented Programming with Records, Sealed Classes, Text Blocks, and More • String Template Pondering • Troubleshooting Native Memory Issues in Java Applications • JavaFX 19 and Beyond -
今日話す内容 • Data Parallel Programming in Java Using the Vector
API •Pattern Matching in Java 19 by Nicolai Parlog • Secure Coding Guidelines for Java SE • Collections Connection Rebooted • Project Wakefield: A New Wayland Desktop for Java on Linux • To Production and Beyond: Metrics with Micrometer • Accelerating Java on the GPU •Pattern Matching: Past, Present, and Future by Gavin Bierman • Project Loom: Modern Scalable Concurrency for the Java Platform •Data-Oriented Programming with Records, Sealed Classes, Text Blocks, and More by Gavin Bierman •String Template Pondering by Gavin Bierman • Troubleshooting Native Memory Issues in Java Applications -
• ローカル変数の型推論(var) • Switch式 • テキストブロック • レコード • シールクラス
• パターンマッチング • etc... 生産性向上のためのJava言語の小 規模な拡張を目的とした OpenJDKのサブプロジェクト Project Amber https://openjdk.org/projects/amber/ -
Project Amberのタイムライン Develop Analyze Identify Advertise Authorize Java 10 Java
11 Java 12 Java 13 Java 14 Java 15 Java 16 Java 17 Java 18 Java 19 JEP 286: Local-Variable Type Inference (var) Standard JEP 323: Local-Variable Syntax for Lambda Parameters Standard JEP 361: Switch Expressions Preview Preview Standard JEP 378: Text Blocks Preview Preview Standard JEP 394: Pattern Matching for instanceof Preview Preview Standard JEP 395: Records Preview Preview Standard JEP 409: Sealed Classes Preview Preview Standard JEP 427: Pattern Matching for switch (Third Preview) Preview Preview Preview JEP 405: Record Patterns (Preview) Preview JEP 430: String Templates (Preview) -
instanceofのパターンマッチング JG PJOTUBODFPG4USJOH \ 4USJOHT 4USJOH P 4ZTUFNPVUQSJOUMO TMFOHUI
^ JG PJOTUBODFPG4USJOHT \ 4ZTUFNPVUQSJOUMO TMFOHUI ^ https://openjdk.java.net/jeps/394 通常のinstanceof パターンマッチング oがStringオブジェクト(instanceofがtrue)である場合、oはStringに キャストされてパターン変数sに割り当てられる 型パターン -
switchのパターンマッチング TXJUDI F \ DBTFϥϕϧ ^ TXJUDI F \
DBTFύλʔϯ ^ 0CKFDUP TXJUDI P \ DBTF4USJOHT4ZTUFNPVUQSJOUMO TMFOHUI ^ https://openjdk.java.net/jeps/427 通常のswitch パターンマッチング 使用例 -
0CKFDUP TXJUDI P \ DBTFOVMM4ZTUFNPVUQSJOUMO OVMM DBTF4USJOHT4ZTUFNPVUQSJOUMO 4USJOH
EFGBVMU4ZTUFNPVUQSJOUMO 4PNFUIJOHFMTF ^ switchのパターンマッチング https://openjdk.java.net/jeps/427 パターンに null を指定できる -
0CKFDUP TXJUDI P \ DBTF*OUFHFSJXIFOJ4ZTUFNPVUQSJOUMO ҎԼͷ DBTF*OUFHFSJ4ZTUFNPVUQSJOUMO Ҏ্ͷ
DBTF4USJOHTXIFOTMFOHUI 4ZTUFNPVUQSJOUMO จࣈҎ্ͷจࣈྻ EFGBVMU4ZTUFNPVUQSJOUMO lͦͷଞ ^ switchのパターンマッチング https://openjdk.java.net/jeps/427 「when」を使ってパターンに条件を指定できる(ガードパターン) Java 19 (3rd Preview) から。17/18では「&&」だった。 -
レコード WBSQOFX1BJS )FMMP 4ZTUFNPVUQSJOUMO QB 4ZTUFNPVUQSJOUMO QC
https://openjdk.java.net/jeps/395 0CKFDUPOFX1BJS )FMMP JG PJOTUBODFPG1BJSQ \ WBSBQB WBSCQC ^ SFDPSE1BJS 0CKFDUB 0CKFDUC \^ レコードの定義 レコードの使用例 レコードも型パターンとして指定できる -
SFDPSE1BJS 0CKFDUB 0CKFDUC \^ 0CKFDUPOFX1BJS )FMMP JG PJOTUBODFPG1BJS
0CKFDUB 0CKFDUC \ 4ZTUFNPVUQSJOUMO B 4ZTUFNPVUQSJOUMO C ^ https://openjdk.java.net/jeps/405 レコード・パターン パターンマッチングでレコードのコンポーネントを取り出せる oがPair(Object,Object)に一致する場合、 aにo.a()の値が、bにo.b()の値が割り当てられる -
SFDPSE1BJS 0CKFDUB 0CKFDUC \^ 0CKFDUPOFX1BJS )FMMP JG PJOTUBODFPG1BJS
4USJOHT *OUFHFSJ \ 4ZTUFNPVUQSJOUMO T 4ZTUFNPVUQSJOUMO J ^ レコード・パターン コンポーネントの型も特定できる oがPair(String,Ingeter)に一致する場合のみ、 sにo.a()の値が、iにo.b()の値が割り当てられる https://openjdk.java.net/jeps/405 -
SFDPSE1BJS 0CKFDUB 0CKFDUC \^ 0CKFDUPOFX1BJS OFX1BJS )FMMP -PDBM%BUFPG
レコード・パターン JG PJOTUBODFPG1BJS WBSB WBSC \ JG BJOTUBODFPG1BJS WBSY WBSZ \ 4ZTUFNPVUQSJOUMO Y 4ZTUFNPVUQSJOUMO Z ^ 4ZTUFNPVUQSJOUMO C ^ JG PJOTUBODFPG1BJS 1BJS WBSY WBSZ WBSC \ 4ZTUFNPVUQSJOUMO Y 4ZTUFNPVUQSJOUMO Z 4ZTUFNPVUQSJOUMO C ^ レコードのコンポーネントがネスト構造になっている場合 レコード・パターンはコンポーネントのネスト構造をサポートしており、 外側と内側のコンポーネントを一度に抽出することができる https://openjdk.java.net/jeps/405 -
パターンマッチングの拡張案 •Underscore patterns •Primitive type patterns •Array patterns •Constant patterns
•Patterns in enhanced for statements •Patterns in local declarations •Patterns in method declarations •Extending record patterns to ordinary classes •...lots more... → C#の破棄パターンのようなもの? → プリミティブ型のパターンマッチング → 配列のパターンマッチング → 定数のパターンマッチング → for文への適用 → ローカル変数宣言への適用 → メソッド宣言への適用 → レコード・パターンを非レコードでも使えるようにする -
SFDPSE1PJOU JOUY JOUZ \^ 1PJOU<>QPJOU"SSBZ GPS 1PJOU WBSY WBSZ QPJOU"SSBZ
\ 4ZTUFNPVUQSJOUMO l z Y l z Z l z ^ for文へのレコード・パターンの適用(案) 拡張for文にレコード・パターンを使用して、 レコードのコンポーネントを直接抽出できるようにする -
SFDPSE1PJOU JOUY JOUZ \^ MFU1PJOU WBSY WBSZ HFU1PJOU
4ZTUFNPVUQSJOUMO Y Y Z Z ローカル変数宣言へのパターンの適用(案) ローカル変数の宣言にパターンを使用して、レコードの コンポーネントを直接受け取ることができるようにする -
DMBTT$PNQMFY\ QSJWBUF fi OBMEPVCMFSFBM QSJWBUF fi OBMEPVCMFJNBHJOBSZ QVCMJD$PNQMFY EPVCMFSFBM EPVCMFJNBHJOBSZ
\^ EFDPOTUSVDUPS$PNQMFY EPVCMFSFBM EPVCMFJNBHJOBSZ \^ ^ JG PJOTUBODFPG$PNQMFY WBSS WBSJ \^ 非レコードへのレコード・パターンの拡張(案) •コンストラクタ = 引数からオブジェクトの状態に値をコピーする •デコンストラクタ = オブジェクトの状態からパターン変数に値をコピーする 参考: https://openjdk.org/projects/amber/design-notes/patterns/pattern-match-object-model -
“Project Amber は、近年 Java に多くの新機能をもた らしました。これらの各機能は自己完結型ですが、連携して 動作するようにも設計されています。具体的には、レコー ド、シールクラス、およびパターンマッチングが連携して、 Java でのデータ指向プログラミングを容易にします。”
- Brian Goetz 参考: https://www.infoq.com/articles/data-oriented-programming-java/ -
データ指向プログラミング 1. コードをデータから分離する 2. 一般的なデータ構造でデータを表現する 3. データを不変として扱う 4. データスキーマをデータ表現から分離する データとコードを分離し、それぞれを個別に考えること
で、オブジェクト指向プログラミングにおけるシステム の設計と実装の複雑さを回避する 4つの原則 -
Javaでのデータ指向プログラミング • データ → レコード • 選択 → シールクラス,シールインタフェース •
プロセス → パターンマッチング これからの -
データ指向プログラミングの適用例 TFBMFEJOUFSGBDF5SFF5\ SFDPSE/JM5 JNQMFNFOUT5SFF5\^ SFDPSE/PEF5 /PEF5MFGU 5WBM /PEF5SJHIU JNQMFNFOUT5SFF5\^ ^
TUBUJD5CPPMFBODPOUBJOT 5SFF5USFF 5UBSHFU \ SFUVSOTXJUDI USFF \ DBTF/JM GBMTF DBTF/PEF WBSMFGU WBSWBM WBSSJHIU UBSHFUFRVBMT WBM ccMFGUDPOUBJOT UBSHFU ccSJHIUDPOUBJOT UBSHFU ^ ^ レコードとシールインタフェースを利用した二分木の定義例 パターンマッチングを利用した探索操作の実装例 -
データ指向プログラミングの適用例 TUBUJD5WPJEJOPSEFS 5SFF5USFF $POTVNFS5D \ TXJUDI USFF \ DBTF/JM CSFBL
DBTF/PEF WBSMFGU WBSWBM WBSSJHUI MFGUJOPSEFS D DBDDFQU WBM SJHIUJOPSEFS D ^ ^ パターンマッチングを利用した整列操作の実装例 レコード、シールクラス、およびパターンマッチングの組み合わ せによって、データ構造をシンプルに表現できるようになる -
JEP 378: テキストブロック 4USJOHUJUMF+BWB0OFใࠂձ 4USJOHUFYUͿΓͷ+BWB0OFͩʂ 4USJOHIUNM IUNM IFBE UJUMFTUJUMF IFBE
CPEZ QTQ CPEZ IUNM GPSNBUUFE UJUMF UFYU https://openjdk.java.net/jeps/378 IUNM IFBE UJUMF+BWB0OFใࠂձUJUMF IFBE CPEZ QͿΓͷ+BWB0OFͩʂQ CPEZ IUNM -
本来やりたかったこと 4USJOHUJUMF+BWB0OFใࠂձ 4USJOHUFYUͿΓͷ+BWB0OFͩʂ 4USJOHIUNM IUNM IFBE UJUMFa\UJUMF^UJUMF IFBE CPEZ Qa\UFYU^Q
CPEZ IUNM lzz IUNM IFBE UJUMF+BWB0OFใࠂձUJUMF IFBE CPEZ QͿΓͷ+BWB0OFͩʂQ CPEZ IUNM -
JEP 430: String Templates(Preview) https://openjdk.java.net/jeps/430 4USJOHUJUMF+BWB0OFใࠂձ 4USJOHUFYUͿΓͷ+BWB0OFͩʂ 4USJOHIUNM453z IUNM IFBE
UJUMFa\UJUMF^UJUMF IFBE CPEZ Qa\UFYU^Q CPEZ IUNM lzz IUNM IFBE UJUMF+BWB0OFใࠂձUJUMF IFBE CPEZ QͿΓͷ+BWB0OFͩʂQ CPEZ IUNM -
JEP 430: String Templates(Preview) https://openjdk.java.net/jeps/430 TUBUJD4USJOHEBUF \ SFUVSO%BUF5JNF'PSNBUUFSPG1BUUFSO lZZZZ..݄EEz
GPSNBU -PDBM%BUF5JNFOPX ^ 4USJOHNFTTBHF453zࠓa\EBUF ^Ͱ͢ɻz メソッドも使える ࠓ݄Ͱ͢ɻ -
JEP 430: String Templates(Preview) https://openjdk.java.net/jeps/430 4USJOHOBNFlͯΒͩΑ͓͠ 4USJOHNFTTBHF453za\OBNF^͕ΜΕz テンプレートプロセッサー テンプレート ≠
String • StringTemplate • TextBlockTemplate String Templatesの文法 -
JEP 430: String Templates(Preview) https://openjdk.java.net/jeps/430 4USJOHOBNFlͯΒͩΑ͓͠ 4USJOH5FNQMBUFUFNQMBUF3"8za\OBNF^͕ΜΕz 4USJOHNFTTBHF453QSPDFTT UFNQMBUF
String Templatesの文法 4USJOHOBNFlͯΒͩΑ͓͠ 4USJOHNFTTBHF453za\OBNF^͕ΜΕz これのシンタックスシュガー -
JEP 430: String Templates(Preview) https://openjdk.java.net/jeps/430 4USJOHUJUMF+BWB0OFใࠂձ 4USJOHUFYUͿΓͷ+BWB0OFͩʂ 5FNQMBUFUFNQMBUF3"8z IUNM IFBE
UJUMFa\UJUMF^UJUMF IFBE CPEZ Qa\UFYU^Q CPEZ IUNM lzz -JTUPG lIUNMaOz lIFBEaOz lUJUMFUJUMFaOz lIFBEaOz lCPEZaOz lQQaOz lCPEZaOz lIUNMaOz template.fragments() -
JEP 430: String Templates(Preview) https://openjdk.java.net/jeps/430 4USJOHUJUMF+BWB0OFใࠂձ 4USJOHUFYUͿΓͷ+BWB0OFͩʂ 5FNQMBUFUFNQMBUF3"8z IUNM IFBE
UJUMFa\UJUMF^UJUMF IFBE CPEZ Qa\UFYU^Q CPEZ IUNM lzz -JTUPG UJUMF UFYU template.values() -
参考サイト • Project Amber https://openjdk.org/projects/amber/ • JEP 430: String
Templates https://openjdk.java.net/jeps/430 • Pattern Matching in the Java Object Model https://openjdk.org/projects/amber/design-notes/patterns/ pattern-match-object-model • InfoQ Data Oriented Programming in Java https://www.infoq.com/articles/data-oriented-programming-java/ -
来年のJavaOneは? Get ready for Oracle CloudWorld 2023, September 18–21 in
Las Vegas https://www.oracle.com/cloudworld/javaone/