文字列操作— Google Guava

序文

Javaでは、文字列は不変の文字シーケンスを表し、作成後に変更することはできません。私たちの日常業務では、文字列が非常に頻繁に使用されます。文字列の熟練した操作により、作業効率が大幅に向上します。本日紹介する主人公は、Googleがオープンソース化したコアJavaライブラリであるGuavaで、コレクションタイプを提供します。、不変のコレクション、同時実行性、I / O、キャッシュ、文字列、その他多くの実用的な機能。この記事では、Guavaで文字列とスプリッターの文字列操作ツールを使用する方法を学びます。

使い方

Google Guava 会同步到 Maven Central 中,所以,如果你是 Maven 项目的话只需要在 pom.xml 文件中引入如下依赖即可:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>28.2-jre</version>
</dependency>

Gradleプロジェクトの場合、build.gradleに次の依存関係を導入するだけです。

コンパイルグループ: 'com.google.guava'、名前: 'guava'、バージョン:'28 .2-jre '
PS:28.2-jreはこの記事の執筆時点での最新バージョンであり、Mavenから現在の最新バージョンを確認できます。中央。

クラスライブラリを導入する必要があるのはなぜですか

Google Guavaは、開発者が開発で完了しなければならないいくつかの反復的なタスクを解決できる、多くの実用的な静的メソッドを提供します。もちろん、この作業を自分で行うこともできますが、クラスライブラリを導入することで、エラーの可能性を減らすことができます。結局のところ、これらのクラスライブラリは、長年にわたって本番環境で検証されています。たとえば、クラスライブラリのStringsによって提供されるメソッドcommonPrefixは、2つの文字列を受け入れ、2つの文字列間の共通プレフィックスを返します(たとえば、abcdとabefはabを返します)。アプリケーションコードでこのような要件に直面したときに、操作を完了するためのコードの記述方法を頭の中で想像できます。この関数を自分で実装するには、まだ時間がかかり、さまざまな境界の例外も考慮する必要があります。これはクラスライブラリによって提供される最大の値の1つであるため、必要な特定の関数をツールメソッドとして使用できる場合は、まず既存のクラスライブラリをいくつか見つけて、自分ではなくそれらを上手に使用する必要があります。要約すると、クラスライブラリを使用する理由はいくつかあります。

Google Guavaライブラリの誰かがそれを徹底的にテストしており、バグが発生する可能性は私たち自身の実装よりもはるかに小さいです。

Google Guavaの一部として、ユーティリティの実装をテストするためのさまざまなテストケースがすでに存在します。コードを自分で作成する場合は、テストを作成して維持する必要があります。

文字列

Google Guavaには、1つの記事ではカバーできない便利なツールクラスとメソッドが多数あります。この記事では、文字列操作に関連する2つのツールクラスのみを紹介します。まず、最初はStringsクラスです。これは、StringとCharSequenceを操作するための実用的なメソッドを提供します。

nullToEmpty、emptyToNull和isNullOrEmpty

nullToEmptyメソッドの機能は次のとおりです。着信文字列がnullの場合、空の文字列 ""を返します。それ以外の場合は、空の文字列を返します。それ以外の場合は、渡された文字列をそのまま返します。

@Test
public void testStringsOfNullToEmpty() {
    System.out.println(Strings.nullToEmpty("mghio"));         // mghio
    System.out.println(Strings.nullToEmpty(""));              // ""
    System.out.println(Strings.nullToEmpty(null));            // ""
    System.out.println(Strings.nullToEmpty(null).isEmpty());  // true
}

emptyToNullメソッドの機能は次のとおりです。nullToEmptyの反対です。空の文字列が渡された場合はnullを返し、それ以外の場合は元の文字列を返します。


@Test
public void testStringsOfEmptyToNull() {
    System.out.println(Strings.emptyToNull("mghio"));  // mghio
    System.out.println(Strings.emptyToNull(null));     // null
    System.out.println(Strings.emptyToNull(""));       // null
}

isNullOrEmptyメソッドの機能は次のとおりです。着信文字列がnullまたは空の場合はtrueを返し、そうでない場合はfalseを返します。


@Test
public void testStringsOfIsNullOrEmpty() {
    System.out.println(Strings.isNullOrEmpty("mghio"));  // false
    System.out.println(Strings.isNullOrEmpty(""));       // true
    System.out.println(Strings.isNullOrEmpty(null));     // true
}

padStartとpadEnd

これらの2つのメソッドには、入力文字列、最小長、および入力する文字の3つのパラメーターがあります。入力文字列の長さが最小になるように、必要な回数だけ入力文字列の先頭に文字を挿入します。長さで渡されます。


@Test
public void testStringsOfPadStart() {
    System.out.println(Strings.padStart("9527", 6, '0'));    // 009527
    System.out.println(Strings.padStart("123456", 6, '0'));  // 123456
}

コードの最初の行では、0が2回入力され、最終的な文字列の長さが(6)で渡した最小の長さに等しくなります。コードの2行目では、入力文字列の長さ自体に必要な最小長があるため、padEndメソッドは、文字の最初ではなく最後にパディングすることを除いて、パディングなしの上記のメソッドと同様です。


@Test
public void testStringsOfPadEnd() {
    System.out.println(Strings.padEnd("9527", 6, '0'));    // 952700
    System.out.println(Strings.padEnd("123456", 6, '0'));  // 123456
}

繰り返す

このメソッドは文字列を渡す必要があり、繰り返し回数がカウントされます。元の文字列で構成される文字列が返され、文字列はカウント回繰り返されます。

@Test
public void testStringsRepeat() {
    System.out.println(Strings.repeat("mghio", 3));  // mghiomghiomghio
}

commonPrefix和commonSuffix

commonPrefixメソッドは、2つの入力文字列間の最大の共通プレフィックスを返し、commonSuffixメソッドは、2つの入力文字列間の最大の共通サフィックスを返します。


@Test
public void testStrings() {
    System.out.println(Strings.commonPrefix("mghio9527", "mghio666"));  // mghio
    System.out.println(Strings.commonSuffix("iammghio", "nicemghio"));  // mghio
}

スプリッター

Splitterクラスによって提供される関数は、その名前と同じであり(トピック外:適切な命名が重要です)、提供された区切り文字に従って文字列を複数の部分文字列に分割するために使用されます。スプリッターを渡すことでSplitterのインスタンスを取得できます。スプリッターを使用すると、スプリッターの構成に従って文字列を分割できます。


@Test
public void testSplitterOfSplit() {
    Iterable<String> result = Splitter.on(",").split("m,g,h,i,o");
    System.out.println(result);  // [m, g, h, i, o]
}

上記の例では、カンマを使用して分割します。したがって、入力文字列m、g、h、i、oをIterableに分割し、それを反復処理すると、[m、g、h、 i、o]。

Splitterインスタンスを取得します

on和onPattern

それでは、スプリッターを入手するさまざまな方法を見てみましょう。onメソッドにはさまざまなオーバーロードバージョンがあり、文字、文字列、または正規表現を区切り文字として使用します。Patternインスタンスを文字列としてonPatternメソッドに渡すこともできます。


@Test
public void testSplitterOfOn() {
    Splitter wordSplitter = Splitter.on(":;");
    // 下面这行输出结果 [the, text, is, separated, by, colon, semicolon]
    System.out.println(wordSplitter.split("the:;text:;is:;separated:;by:;colon:;semicolon"));
    Splitter patternBasedSplitter = Splitter.on(Pattern.compile("\\s+"));
    System.out.println(patternBasedSplitter.split("abc   dmg hio"));         // [abc, dmg, hio]
    System.out.println(Splitter.onPattern("\\s+").split("www   mghio cn"));  // [www, mghio, cn]
}

fixedLength

fixedLengthも最も便利な方法の1つであり、文字列を指定された長さの等しい部分に分割できます。最後の部分は指定された長さよりも短い場合があることに注意してください。


@Test
public void testSplitterOfFixedLength() {
    Splitter fixedLengthSplitter = Splitter.fixedLength(3);
    System.out.println(fixedLengthSplitter.split("iammghiojava"));          // [iam, mgh, ioj, ava]
    System.out.println(fixedLengthSplitter.split("https://www.mghio.cn"));  // [htt, ps:, //w, ww., mgh, io., cn]
}

スプリッタモディファイアメソッド

Splitterは、Splitterの動作を変更または変更するために使用できる一般的なメソッドも提供します。

trimResults

このメソッドは、生成されたスプリッターの結果文字列から先頭と末尾のスペースを削除できます。


@Test
public void testSplitterOfTrimResult() {
    Splitter commaSplitter = Splitter.on(",");
    System.out.println(commaSplitter.split("m, g, h, i, o"));         // [m,  g,  h,  i,  o]
    Splitter commaSplitterWithTrim = commaSplitter.trimResults();
    System.out.println(commaSplitterWithTrim.split("m, g, h, i, o")); // [m, g, h, i, o]
}

最初の分割結果には、文字列g、h、i、oの前にスペースがあり、trimResultsメソッドを使用した後、これらの先頭のスペースは削除されることに注意してください。

省略EmptyStrings

このメソッドは、結果からすべての空の文字列を無視します。


@Test
public void testSplitterOfOmitEmptyStrings() {
    Splitter commaSplitter = Splitter.on(",");
    System.out.println(commaSplitter.split("m,,g,h,i,o"));                   // [m, , g, h, i, o]
    Splitter commaSplitterWithNoEmptyString = commaSplitter.omitEmptyStrings();
    System.out.println(commaSplitterWithNoEmptyString.split("m,,g,h,i,o"));  // [m, g, h, i, o]
}

上記のcommaSplitterWithNoEmptyStringは、空の文字列の結果を出力から削除します。

制限

このメソッドは元のスプリッターと同等のスプリッターを返しますが、指定された入力制限に達すると分割を停止し、残りの結果文字列を1つのアイテムとして出力します。つまり、渡すことができます。パラメーターは、に存在するアイテムの最大数を指定します。結果。このメソッドが空の文字列を省略した場合、省略された文字列はカウントされないことに注意してください。


@Test
public void testSplitterOfLimit() {
    Splitter commaSplitter = Splitter.on(",");
    Splitter limitingCommaSplitter = commaSplitter.limit(3);
    System.out.println(limitingCommaSplitter.split("i,m,g,h,i,o"));  // [i, m, g,h,i,o]
}

スプリッターは不変であるため(これは文字列に似ています)、それを呼び出す修飾子メソッドは新しいスプリッターを返し、元のスプリッターを変更しないことに注意してください。

@Test
public void testSplitterImmutable() {
    Splitter splitter = Splitter.on('/');
    System.out.println("Before: " + splitter);  // Before: com.google.common.base.Splitter@33b37288
    splitter.trimResults();                     // do nothing
    System.out.println("First: " + splitter);   // First: com.google.common.base.Splitter@33b37288
    splitter = splitter.trimResults();          // the returned splitter to be assigned
    System.out.println("Second: " + splitter);  // Second: com.google.common.base.Splitter@77a57272
}

splitToList

以前に使用したsplitメソッドは、Iterableオブジェクトを返します。ここでのsplitToListメソッドはリストを返します。splitメソッドはIterableを返すため、レイジーです。


@Test
public void testSplitterOfSplitToList() {
    Splitter commaSplitter = Splitter.on(",");
    List<String> result = commaSplitter.splitToList("m,g,h,i,o");
    System.out.println(result);  // [m, g, h, i, o]
}

MapSplitter

MapSplitterは、その名前が示すように、文字列をMapオブジェクトに分割するために使用されます。withKeyValueSeparatorメソッドを使用して、文字、文字列、またはSplitterオブジェクトをパラメーターとして受け取るSplitterからMapSplitterオブジェクトを取得できます。まず、元のスプリッターに従って文字列を複数のアイテムに分割し、次にwithKeyValueSeparatorメソッドに渡されたスプリッターを使用して、各アイテムをMapのキーと値のペアに分割します。


@Test
public void testSplitterOfWithKeyValueSeparator() {
    Splitter commaSplitter = Splitter.on(',');
    Splitter.MapSplitter keyValueSplitter = commaSplitter.withKeyValueSeparator('=');
    Map<String, String> map = keyValueSplitter.split("name=mghio,blog=mghio.cn");
    System.out.println(map);  // {name=mghio, blog=mghio.cn}
}

結果からわかるように、2つのエントリ(name = mghioとblog = mghio.cn)に分割されています。もう1つ注意すべき点は、元のスプリッターで修飾子を指定した場合、それらはこのスプリッターにのみ適用されるということです。 MapSplitterではありません。


@Test
public void testSplitterOfWithKeyValueSeparatorAndModifiers() {
    Splitter originalSplitter = Splitter.on(",").trimResults();
    Splitter.MapSplitter keyValueSplitter = originalSplitter.withKeyValueSeparator('=');
    // 输出结果:{name  =mghio, blog=   mghio.cn}
    System.out.println(keyValueSplitter.split("name  =mghio,   blog=   mghio.cn"));  
}

上記の結果から、trimResultsの変更方法は元のスプリッターにのみ適用可能であることがわかります。したがって、ブログの先頭のスペースは削除されていますが(を使用して元の文字列を分割する場合)、mghio.cnの先頭のスペースは削除されません(=を使用してキー値を分割する場合)。

最後に注意すべき点は、MapSplitterクラスが@Betaとしてマークされていることです。これは、クラスライブラリ内のMapSplitterに関連するクラスとメソッドが実験的であり、(不連続な方法で)変更でき、将来削除される可能性があることを意味します。バージョン。

総括する

この記事では、Google Guavaライブラリと、それをプロジェクトまたはアプリケーションで使用する利点、およびそれをアプリケーションにインポートする方法を紹介しました。次に、Guavaライブラリで文字列操作ツール(StringsとSplitter)の基本的な使用法をいくつか紹介しました。もちろん、これは氷山の一角にすぎません。Guavaライブラリには、他にも多くの便利な基本機能があります。関連ドキュメントをクエリする必要があります。理解してください。興味のある友人は、その実装ソースコードを見に行くことができます。このライブラリのコードは、非常にエレガントです。

おすすめ

転載: blog.51cto.com/15075507/2607584