Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JavaOne 2022 報告会(パターンマッチングとString Templatesの話)

JavaOne 2022 報告会(パターンマッチングとString Templatesの話)

Sugiyama Takaaki

November 11, 2022
Tweet

More Decks by Sugiyama Takaaki

Other Decks in Programming

Transcript

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

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

  3. 2022年のJavaOne •Oracle Cloud World との併催 •開催期間:10月18日から20日(3日間) •開催場所:ラスベガス(シーザーズ・フォーラム) •セッション数:142セッション •キーノート:        3 •通常セッション:      92

    •ライトニング・セッション: 22 •ハンズオンラボ:      10 •BOF:           8 •ハッカソン:        7 •一部セッションはオンライン配信あり
  4. オンデマンド配信 https://www.oracle.com/cloudworld/javaone/ 2022/11/18までは、オンデマン ド配信が視聴可能 
 無料枠でもキーノートと9個のテク ニカルセッションが観られるらしい

  5. 私が参加したセッション • 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
  6. 今日話す内容 • 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
  7. • ローカル変数の型推論(var) • Switch式 • テキストブロック • レコード • シールクラス

    • パターンマッチング • etc... 生産性向上のためのJava言語の小 規模な拡張を目的とした OpenJDKのサブプロジェクト Project Amber https://openjdk.org/projects/amber/
  8. 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)
  9. パターンマッチングの話

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

  11. 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に割り当てられる 型パターン
  12. switchのパターンマッチング TXJUDI F \ DBTFϥϕϧ  ^ TXJUDI F \

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

    EFGBVMU4ZTUFNPVUQSJOUMO 4PNFUIJOHFMTF  ^ switchのパターンマッチング https://openjdk.java.net/jeps/427 パターンに null を指定できる
  14. 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では「&&」だった。
  15. レコード WBSQOFX1BJS )FMMP   4ZTUFNPVUQSJOUMO QB  4ZTUFNPVUQSJOUMO QC

     https://openjdk.java.net/jeps/395 0CKFDUPOFX1BJS )FMMP   JG PJOTUBODFPG1BJSQ \ WBSBQB  WBSCQC  ^ SFDPSE1BJS 0CKFDUB 0CKFDUC \^ レコードの定義 レコードの使用例 レコードも型パターンとして指定できる
  16. 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()の値が割り当てられる
  17. 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
  18. 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
  19. パターンマッチングの拡張案 •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文への適用 → ローカル変数宣言への適用 → メソッド宣言への適用 → レコード・パターンを非レコードでも使えるようにする
  20. SFDPSE1PJOU JOUY JOUZ \^ 1PJOU<>QPJOU"SSBZ GPS 1PJOU WBSY WBSZ QPJOU"SSBZ

    \ 4ZTUFNPVUQSJOUMO l z Y l z Z l z  ^ for文へのレコード・パターンの適用(案) 拡張for文にレコード・パターンを使用して、 
 レコードのコンポーネントを直接抽出できるようにする
  21. SFDPSE1PJOU JOUY JOUZ \^ MFU1PJOU WBSY WBSZ HFU1PJOU  

    4ZTUFNPVUQSJOUMO Y Y Z Z  ローカル変数宣言へのパターンの適用(案) ローカル変数の宣言にパターンを使用して、レコードの コンポーネントを直接受け取ることができるようにする
  22. 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
  23. “Project Amber は、近年 Java に多くの新機能をもた らしました。これらの各機能は自己完結型ですが、連携して 動作するようにも設計されています。具体的には、レコー ド、シールクラス、およびパターンマッチングが連携して、 Java でのデータ指向プログラミングを容易にします。”

     - Brian Goetz 参考: https://www.infoq.com/articles/data-oriented-programming-java/
  24. データ指向プログラミング 1. コードをデータから分離する 2. 一般的なデータ構造でデータを表現する 3. データを不変として扱う 4. データスキーマをデータ表現から分離する データとコードを分離し、それぞれを個別に考えること

    で、オブジェクト指向プログラミングにおけるシステム の設計と実装の複雑さを回避する 4つの原則
  25. Javaでのデータ指向プログラミング • データ → レコード • 選択 → シールクラス,シールインタフェース •

    プロセス → パターンマッチング これからの
  26. データ指向プログラミングの適用例 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  ^ ^ レコードとシールインタフェースを利用した二分木の定義例 パターンマッチングを利用した探索操作の実装例
  27. データ指向プログラミングの適用例 TUBUJD5WPJEJOPSEFS 5SFF5USFF $POTVNFS5D \ TXJUDI USFF \ DBTF/JM CSFBL

    DBTF/PEF WBSMFGU WBSWBM WBSSJHUI  MFGUJOPSEFS D  DBDDFQU WBM  SJHIUJOPSEFS D  ^ ^ パターンマッチングを利用した整列操作の実装例 レコード、シールクラス、およびパターンマッチングの組み合わ せによって、データ構造をシンプルに表現できるようになる
  28. String Templatesの話

  29. 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
  30. 本来やりたかったこと 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
  31. 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
  32. 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 メソッドも使える ࠓ೔͸೥݄೔Ͱ͢ɻ
  33. JEP 430: String Templates(Preview) https://openjdk.java.net/jeps/430 4USJOHOBNFlͯΒͩΑ͓͠ 4USJOHNFTTBHF453za\OBNF^͕Μ͹Εz テンプレートプロセッサー テンプレート ≠

    String • StringTemplate • TextBlockTemplate String Templatesの文法
  34. JEP 430: String Templates(Preview) https://openjdk.java.net/jeps/430 4USJOHOBNFlͯΒͩΑ͓͠ 4USJOH5FNQMBUFUFNQMBUF3"8za\OBNF^͕Μ͹Εz 4USJOHNFTTBHF453QSPDFTT UFNQMBUF 

    String Templatesの文法 4USJOHOBNFlͯΒͩΑ͓͠ 4USJOHNFTTBHF453za\OBNF^͕Μ͹Εz これのシンタックスシュガー
  35. 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()
  36. 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()
  37. String Templatesの使いどころ •データベースクエリ(SQL)の生成 •HTML/CSS/JavaScriptのテンプレートとして •JavaScriptやPythonなど、他言語との相互利用 •Conditional Logging(条件によるログ出力制御) •コレクション(ListやMapなど)の新しい表現 •ドメイン固有言語 •ソースコードベースのテストスイート

    •etc...
  38. 3つの大事なこと

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

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

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

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

  43. たぶん2度とない経験

  44. 参考サイト • 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/
  45. 来年のJavaOneは? Get ready for Oracle CloudWorld 2023, September 18–21 in

    Las Vegas https://www.oracle.com/cloudworld/javaone/