毎日 Java を作成していると、文字列に対する操作が非常に頻繁に行われます。その中で最も一般的なのは文字列の編成です。また、この操作は非常に一般的であるため、多くの解決策が生まれています。一般に、次のようないくつかのタイプがあります。
+
ステッチを使用する- 使用
StringBuffer
し、SpringBuilder
String::format
そしてString::formatted
- 使用
java.text.MessageFormat
次に、Java 21 の新しいソリューションについて学びましょう。上記に詳しくない場合は、まずこの「Java に組み込まれた 4 つの文字列の構成と書式設定メソッド」を読んで以前の仕組みを理解し、最新の処理スキームと比較することで理解が深まることをお勧めします。より深い。
テンプレート式
Java 21 で文字列を処理する新しい方法は、「テンプレート式」、つまり「テンプレート式」と呼ばれます。
テンプレート式は、Java 言語の新しい式です。文字列補間を実行できるため、開発者がプログラムで文字列を安全かつ効率的に整理できるようになります。さらに、テンプレート式を使用すると、文字列を整理するだけでなく、特定のモデルのルールに従って構造化テキストを任意のタイプのオブジェクトに変換することもできます。
簡単なケースを通してそれを理解してみましょう。
String blog = "blog.didispace.com";
String str = STR."My blog is \{blog}";
上記のコードの 2 行目はテンプレート式で、主に次の 3 つの部分が含まれています。
- テンプレートハンドラー:
STR
- 埋め込み式を含む
\{blog}
テンプレート( ) - 前の 2 つの部分を組み合わせると
.
、フォームはメソッド呼び出しと似たものになります。
テンプレート式の実行中、テンプレート プロセッサはテンプレートの内容と埋め込み式の値を組み合わせて結果を生成します。そのため、上記の場合の実行時の文字列 str の結果は次のようになりますMy blog is blog.didispace.com
。
複数行のテンプレート式
「Java 新機能」コラムで紹介した Java 15 のテキスト ブロック機能を覚えていますか? このようなもの:
String html = """
<html>
<body>
<h1>Java 15 新特性:文本块 | 程序猿DD</h1>
<p>didispace.com</p>
</body>
</html>
""";
テンプレート式は同様の複数行の文字列処理もサポートしているため、開発者はこれを使用して、HTML、json、xml などの文字列コンテンツを簡単に編成できます。たとえば、次のようになります。
var json = STR."""
{
"user": "\{name}",
"age: \{age}
}
""";
STR テンプレート プロセッサ
上記の場合、使用した STR テンプレート プロセッサーの埋め込み式はすべて文字列コンテンツを使用していますが、実際には、STR テンプレート プロセッサーにはさらに多くの用途があります。
- 数学的演算は、次のような埋め込み式でも実行できます。
int x = 10, y = 20;
String s = STR."\{x} + \{y} = \{x + y}";
最終的な s 文字列の結果は次のようになります。10 + 20 = 30
- メソッドは、次のような埋め込み式で呼び出すこともできます。
String s = STR."My blog is \{getMyBlog()}";
getMyBlog メソッドによって返されるコンテンツが であると仮定するとblog.didispace.com
、最終的な s 文字列の結果は次のようになりますMy blog is blog.didispace.com
。
- オブジェクトのメンバー変数には、次のような埋め込み式でもアクセスできます。
User u = new User("didi", "blog.didispace.com"); // 构造函数参数为name属性和blog属性
String s = STR."\{u.name}的博客地地址为:+ \{u.blog}";
最終的な s 文字列の結果は次のようになりますdidi的博客地址为:blog.didispace.com
。
FMT テンプレート プロセッサ
STRテンプレート プロセッサに加えて、Java は別のテンプレート プロセッサFMTも提供します。STR テンプレート プロセッサと同じ補間機能を提供することに加えて、FMT テンプレート プロセッサは左側のフォーマット処理も提供します。FMT の機能を直接理解するために例を使用してみましょう。
record Rectangle(String name, double width, double height) {
double area() {
return width * height;
}
}
Rectangle[] zone = new Rectangle[] {
new Rectangle("Alfa", 17.8, 31.4),
new Rectangle("Bravo", 9.6, 12.4),
new Rectangle("Charlie", 7.1, 11.23),
};
String table = STR."""
Description Width Height Area
\{zone[0].name} \{zone[0].width} \{zone[0].height} \{zone[0].area()}
\{zone[1].name} \{zone[1].width} \{zone[1].height} \{zone[1].area()}
\{zone[2].name} \{zone[2].width} \{zone[2].height} \{zone[2].area()}
Total \{zone[0].area() + zone[1].area() + zone[2].area()}
""";
上記のブロックは、文字列テーブル データを整理するために STR テンプレート プロセッサによって整理されており、テンプレート式の観点から見ると非常にきれいですが、テンプレートに埋め込まれた式の値の長さが異なるため、 STR などの最終出力は満足のいくものではない可能性があります。テンプレート プロセッサの処理結果は次のとおりです。
Description Width Height Area
Alfa 17.8 31.4 558.92
Bravo 9.6 12.4 119.03999999999999
Charlie 7.1 11.23 79.733
Total 757.693
この問題を解決するために、FMT テンプレート プロセッサを使用して各列の左側の形式を定義できます。
String table = FMT."""
Description Width Height Area
%-12s\{zone[0].name} %7.2f\{zone[0].width} %7.2f\{zone[0].height} %7.2f\{zone[0].area()}
%-12s\{zone[1].name} %7.2f\{zone[1].width} %7.2f\{zone[1].height} %7.2f\{zone[1].area()}
%-12s\{zone[2].name} %7.2f\{zone[2].width} %7.2f\{zone[2].height} %7.2f\{zone[2].area()}
\{" ".repeat(28)} Total %7.2f\{zone[0].area() + zone[1].area() + zone[2].area()}
""";
この結果は次のようになり、きちんとした結果が得られます。
Description Width Height Area
Alfa 17.80 31.40 558.92
Bravo 9.60 12.40 119.04
Charlie 7.10 11.23 79.73
Total 757.69
Java 21 で導入された文字列テンプレート機能には、カスタム テンプレート プロセッサなど、多くの高度な機能があります。この機能はまだプレビュー段階にあるため、DD では詳細に検討しておらず、基本的な機能のみを試していますが、その他の高度な機能に興味がある場合は、公式 Web サイトを通じて学習することもできます。機能が正式にリリースされた後、Java 新機能コラムのすべての内容を更新して解釈します。フォローして収集することを歓迎します。
私の公式アカウント、Programmer DD にご注目ください。最先端のテクノロジーにより、コーナー追い越しの可能性があることは以前から知られていました。追い抜き資金を貯めるにはDDに注目することから始めましょう!