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

    •ライトニング・セッション: 22 •ハンズオンラボ:      10 •BOF:           8 •ハッカソン:        7 •一部セッションはオンライン配信あり
  2. 私が参加したセッション • 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
  3. 今日話す内容 • 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
  4. • ローカル変数の型推論(var) • Switch式 • テキストブロック • レコード • シールクラス

    • パターンマッチング • etc... 生産性向上のためのJava言語の小 規模な拡張を目的とした OpenJDKのサブプロジェクト Project Amber https://openjdk.org/projects/amber/
  5. 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)
  6. 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に割り当てられる 型パターン
  7. switchのパターンマッチング TXJUDI F \ DBTFϥϕϧ  ^ TXJUDI F \

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

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

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

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

    4ZTUFNPVUQSJOUMO Y Y Z Z  ローカル変数宣言へのパターンの適用(案) ローカル変数の宣言にパターンを使用して、レコードの コンポーネントを直接受け取ることができるようにする
  17. 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
  18. データ指向プログラミングの適用例 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  ^ ^ レコードとシールインタフェースを利用した二分木の定義例 パターンマッチングを利用した探索操作の実装例
  19. データ指向プログラミングの適用例 TUBUJD5WPJEJOPSEFS 5SFF5USFF $POTVNFS5D \ TXJUDI USFF \ DBTF/JM CSFBL

    DBTF/PEF WBSMFGU WBSWBM WBSSJHUI  MFGUJOPSEFS D  DBDDFQU WBM  SJHIUJOPSEFS D  ^ ^ パターンマッチングを利用した整列操作の実装例 レコード、シールクラス、およびパターンマッチングの組み合わ せによって、データ構造をシンプルに表現できるようになる
  20. 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
  21. 本来やりたかったこと 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
  22. 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
  23. 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 メソッドも使える ࠓ೔͸೥݄೔Ͱ͢ɻ
  24. JEP 430: String Templates(Preview) https://openjdk.java.net/jeps/430 4USJOHOBNFlͯΒͩΑ͓͠ 4USJOH5FNQMBUFUFNQMBUF3"8za\OBNF^͕Μ͹Εz 4USJOHNFTTBHF453QSPDFTT UFNQMBUF 

    String Templatesの文法 4USJOHOBNFlͯΒͩΑ͓͠ 4USJOHNFTTBHF453za\OBNF^͕Μ͹Εz これのシンタックスシュガー
  25. 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()
  26. 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()
  27. 参考サイト • 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/
  28. 来年のJavaOneは? Get ready for Oracle CloudWorld 2023, September 18–21 in

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