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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  4. オンデマンド配信
    https://www.oracle.com/cloudworld/javaone/
    2022/11/18までは、オンデマン
    ド配信が視聴可能

    無料枠でもキーノートと9個のテク
    ニカルセッションが観られるらしい

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

  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)

    View full-size slide

  9. パターンマッチングの話

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  12. switchのパターンマッチング
    TXJUDI F
    \
    DBTFϥϕϧ

    ^
    TXJUDI F
    \
    DBTFύλʔϯ

    ^
    0CKFDUP
    TXJUDI P
    \
    DBTF4USJOHT4ZTUFNPVUQSJOUMO TMFOHUI



    ^
    https://openjdk.java.net/jeps/427
    通常のswitch パターンマッチング
    使用例

    View full-size slide

  13. 0CKFDUP
    TXJUDI P
    \
    DBTFOVMM4ZTUFNPVUQSJOUMO OVMM

    DBTF4USJOHT4ZTUFNPVUQSJOUMO 4USJOH

    EFGBVMU4ZTUFNPVUQSJOUMO 4PNFUIJOHFMTF

    ^
    switchのパターンマッチング
    https://openjdk.java.net/jeps/427
    パターンに null を指定できる

    View full-size slide

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

    View full-size slide

  15. レコード
    WBSQOFX1BJS )FMMP

    4ZTUFNPVUQSJOUMO QB


    4ZTUFNPVUQSJOUMO QC


    https://openjdk.java.net/jeps/395
    0CKFDUPOFX1BJS )FMMP

    JG PJOTUBODFPG1BJSQ
    \
    WBSBQB

    WBSCQC

    ^
    SFDPSE1BJS 0CKFDUB 0CKFDUC
    \^
    レコードの定義
    レコードの使用例
    レコードも型パターンとして指定できる

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

  20. SFDPSE1PJOU JOUY JOUZ
    \^
    1PJOU<>QPJOU"SSBZ
    GPS 1PJOU WBSY WBSZ
    QPJOU"SSBZ
    \
    4ZTUFNPVUQSJOUMO l zYl zZl
    z

    ^
    for文へのレコード・パターンの適用(案)
    拡張for文にレコード・パターンを使用して、

    レコードのコンポーネントを直接抽出できるようにする

    View full-size slide

  21. SFDPSE1PJOU JOUY JOUZ
    \^
    MFU1PJOU WBSY WBSZ
    HFU1PJOU

    4ZTUFNPVUQSJOUMO YYZZ

    ローカル変数宣言へのパターンの適用(案)
    ローカル変数の宣言にパターンを使用して、レコードの
    コンポーネントを直接受け取ることができるようにする

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    ^
    ^
    レコードとシールインタフェースを利用した二分木の定義例
    パターンマッチングを利用した探索操作の実装例

    View full-size slide

  27. データ指向プログラミングの適用例
    TUBUJD5WPJEJOPSEFS 5SFF5USFF $POTVNFS5D
    \
    TXJUDI USFF
    \
    DBTF/JM
    CSFBL
    DBTF/PEF WBSMFGU WBSWBM WBSSJHUI

    MFGUJOPSEFS D

    DBDDFQU WBM

    SJHIUJOPSEFS D

    ^
    ^
    パターンマッチングを利用した整列操作の実装例
    レコード、シールクラス、およびパターンマッチングの組み合わ
    せによって、データ構造をシンプルに表現できるようになる

    View full-size slide

  28. String Templatesの話

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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
    メソッドも使える
    ࠓ೔͸೥݄೔Ͱ͢ɻ

    View full-size slide

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

    View full-size slide

  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
    これのシンタックスシュガー

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  38. 3つの大事なこと

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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/

    View full-size slide

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

    View full-size slide