Slide 1

Slide 1 text

パターンマッチングの話 String Templatesの話 JavaOne 2022 報告会 杉山貴章 @zinbe

Slide 2

Slide 2 text

JavaOneとは? •1996年から毎年開催されている(いた)Java開 発者のためのイベント •2016年から「Oracle Code One」に名称変更 •対象をJava以外の技術にも拡大(という名目) •2020/2021年はCovid-19のため中止 •過去には日本でも開催されたことがある •2001年,2002年,2005年,2012年

Slide 3

Slide 3 text

2022年のJavaOne •Oracle Cloud World との併催 •開催期間:10月18日から20日(3日間) •開催場所:ラスベガス(シーザーズ・フォーラム) •セッション数:142セッション •キーノート:        3 •通常セッション:      92 •ライトニング・セッション: 22 •ハンズオンラボ:      10 •BOF:           8 •ハッカソン:        7 •一部セッションはオンライン配信あり

Slide 4

Slide 4 text

オンデマンド配信 https://www.oracle.com/cloudworld/javaone/ 2022/11/18までは、オンデマン ド配信が視聴可能 
 無料枠でもキーノートと9個のテク ニカルセッションが観られるらしい

Slide 5

Slide 5 text

私が参加したセッション • 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

Slide 6

Slide 6 text

今日話す内容 • 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

Slide 7

Slide 7 text

• ローカル変数の型推論(var) • Switch式 • テキストブロック • レコード • シールクラス • パターンマッチング • etc... 生産性向上のためのJava言語の小 規模な拡張を目的とした OpenJDKのサブプロジェクト Project Amber https://openjdk.org/projects/amber/

Slide 8

Slide 8 text

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)

Slide 9

Slide 9 text

パターンマッチングの話

Slide 10

Slide 10 text

パターンマッチングとは? オブジェクトが特定の型や構造に一致するかど うかをテストし、一致した場合には、そのオブ ジェクトからデータを抽出する

Slide 11

Slide 11 text

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に割り当てられる 型パターン

Slide 12

Slide 12 text

switchのパターンマッチング TXJUDI F \ DBTFϥϕϧ ^ TXJUDI F \ DBTFύλʔϯ ^ 0CKFDUP TXJUDI P \ DBTF4USJOHT4ZTUFNPVUQSJOUMO TMFOHUI ^ https://openjdk.java.net/jeps/427 通常のswitch パターンマッチング 使用例

Slide 13

Slide 13 text

0CKFDUP TXJUDI P \ DBTFOVMM4ZTUFNPVUQSJOUMO OVMM DBTF4USJOHT4ZTUFNPVUQSJOUMO 4USJOH EFGBVMU4ZTUFNPVUQSJOUMO 4PNFUIJOHFMTF ^ switchのパターンマッチング https://openjdk.java.net/jeps/427 パターンに null を指定できる

Slide 14

Slide 14 text

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では「&&」だった。

Slide 15

Slide 15 text

レコード WBSQOFX1BJS )FMMP 4ZTUFNPVUQSJOUMO QB 4ZTUFNPVUQSJOUMO QC https://openjdk.java.net/jeps/395 0CKFDUPOFX1BJS )FMMP JG PJOTUBODFPG1BJSQ \ WBSBQB WBSCQC ^ SFDPSE1BJS 0CKFDUB 0CKFDUC \^ レコードの定義 レコードの使用例 レコードも型パターンとして指定できる

Slide 16

Slide 16 text

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()の値が割り当てられる

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

パターンマッチングの拡張案 •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文への適用 → ローカル変数宣言への適用 → メソッド宣言への適用 → レコード・パターンを非レコードでも使えるようにする

Slide 20

Slide 20 text

SFDPSE1PJOU JOUY JOUZ \^ 1PJOU<>QPJOU"SSBZ GPS 1PJOU WBSY WBSZ QPJOU"SSBZ \ 4ZTUFNPVUQSJOUMO l zYl zZl z ^ for文へのレコード・パターンの適用(案) 拡張for文にレコード・パターンを使用して、 
 レコードのコンポーネントを直接抽出できるようにする

Slide 21

Slide 21 text

SFDPSE1PJOU JOUY JOUZ \^ MFU1PJOU WBSY WBSZ HFU1PJOU 4ZTUFNPVUQSJOUMO YYZZ ローカル変数宣言へのパターンの適用(案) ローカル変数の宣言にパターンを使用して、レコードの コンポーネントを直接受け取ることができるようにする

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

“Project Amber は、近年 Java に多くの新機能をもた らしました。これらの各機能は自己完結型ですが、連携して 動作するようにも設計されています。具体的には、レコー ド、シールクラス、およびパターンマッチングが連携して、 Java でのデータ指向プログラミングを容易にします。” - Brian Goetz 参考: https://www.infoq.com/articles/data-oriented-programming-java/

Slide 24

Slide 24 text

データ指向プログラミング 1. コードをデータから分離する 2. 一般的なデータ構造でデータを表現する 3. データを不変として扱う 4. データスキーマをデータ表現から分離する データとコードを分離し、それぞれを個別に考えること で、オブジェクト指向プログラミングにおけるシステム の設計と実装の複雑さを回避する 4つの原則

Slide 25

Slide 25 text

Javaでのデータ指向プログラミング • データ → レコード • 選択 → シールクラス,シールインタフェース • プロセス → パターンマッチング これからの

Slide 26

Slide 26 text

データ指向プログラミングの適用例 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 ^ ^ レコードとシールインタフェースを利用した二分木の定義例 パターンマッチングを利用した探索操作の実装例

Slide 27

Slide 27 text

データ指向プログラミングの適用例 TUBUJD5WPJEJOPSEFS 5SFF5USFF $POTVNFS5D \ TXJUDI USFF \ DBTF/JM CSFBL DBTF/PEF WBSMFGU WBSWBM WBSSJHUI MFGUJOPSEFS D DBDDFQU WBM SJHIUJOPSEFS D ^ ^ パターンマッチングを利用した整列操作の実装例 レコード、シールクラス、およびパターンマッチングの組み合わ せによって、データ構造をシンプルに表現できるようになる

Slide 28

Slide 28 text

String Templatesの話

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

本来やりたかったこと 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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

JEP 430: String Templates(Preview) https://openjdk.java.net/jeps/430 TUBUJD4USJOHEBUF \ SFUVSO%BUF5JNF'PSNBUUFSPG1BUUFSO lZZZZ೥..݄EE೔z GPSNBU -PDBM%BUF5JNFOPX ^ 4USJOHNFTTBHF453zࠓ೔͸a\EBUF ^Ͱ͢ɻz メソッドも使える ࠓ೔͸೥݄೔Ͱ͢ɻ

Slide 33

Slide 33 text

JEP 430: String Templates(Preview) https://openjdk.java.net/jeps/430 4USJOHOBNFlͯΒͩΑ͓͠ 4USJOHNFTTBHF453za\OBNF^͕Μ͹Εz テンプレートプロセッサー テンプレート ≠ String • StringTemplate • TextBlockTemplate String Templatesの文法

Slide 34

Slide 34 text

JEP 430: String Templates(Preview) https://openjdk.java.net/jeps/430 4USJOHOBNFlͯΒͩΑ͓͠ 4USJOH5FNQMBUFUFNQMBUF3"8za\OBNF^͕Μ͹Εz 4USJOHNFTTBHF453QSPDFTT UFNQMBUF String Templatesの文法 4USJOHOBNFlͯΒͩΑ͓͠ 4USJOHNFTTBHF453za\OBNF^͕Μ͹Εz これのシンタックスシュガー

Slide 35

Slide 35 text

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()

Slide 36

Slide 36 text

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()

Slide 37

Slide 37 text

String Templatesの使いどころ •データベースクエリ(SQL)の生成 •HTML/CSS/JavaScriptのテンプレートとして •JavaScriptやPythonなど、他言語との相互利用 •Conditional Logging(条件によるログ出力制御) •コレクション(ListやMapなど)の新しい表現 •ドメイン固有言語 •ソースコードベースのテストスイート •etc...

Slide 38

Slide 38 text

3つの大事なこと

Slide 39

Slide 39 text

3つの大事なこと 1. これはプレビュー版です

Slide 40

Slide 40 text

大事なこと 1. これはプレビュー版です 2. これはプレビュー版です

Slide 41

Slide 41 text

大事なこと 1. これはプレビュー版です 2. これはプレビュー版です 3. これはプレビュー版です

Slide 42

Slide 42 text

2022年のJavaOneのポイント オフライン開催は2019年以来3年ぶり! 「JavaOne」の名前での開催は2015年以来7年ぶり! 初のラスベガス開催! 日本人で参加したのは(おそらく)10人以下! (※JavaOne目的の人)

Slide 43

Slide 43 text

たぶん2度とない経験

Slide 44

Slide 44 text

参考サイト • 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/

Slide 45

Slide 45 text

来年のJavaOneは? Get ready for Oracle CloudWorld 2023, September 18–21 in Las Vegas https://www.oracle.com/cloudworld/javaone/