1. 概要

Javaは、連結するためのさまざまなメソッドとクラスを提供します s 。 しかし、結果として注意を払わないと、望ましくない値が含まれる可能性がありますヌルオブジェクト。

このチュートリアルでは、 String を連結するときに、 null Stringオブジェクトを回避するためのいくつかのアプローチを示します。

2. 問題文

String 配列の要素を連結したいとします。ここで、要素のいずれかがnullである可能性があります。

+演算子を使用してこれを簡単に行うことができます。

String[] values = { "Java ", null, "", "is ", "great!" };
String result = "";

for (String value : values) {
    result = result + value;
}

これにより、以下に示すように、すべての要素が結果のStringに連結されます。

Java nullis great!

ただし、そのような「null」値を表示したり、出力に追加したりしたくない場合があります。

同様に、アプリケーションがJava 8以降のバージョンで実行されている場合、 String.join()静的メソッドを使用して同じ出力を取得します。

String result = String.join("", values);

String.join()メソッドを使用している間も、null要素が連結されるのを避けることはできません。

これらのnull要素が連結されないようにするためのいくつかのアプローチを見て、期待される結果を取得してみましょう:「Javaは素晴らしいです!」。

3. +演算子の使用

加算(+)演算子は、JavaでStringを連結するためにオーバーロードされます。 +演算子を使用して連結しているときに、Stringnullであるかどうかを確認し、 null String を空の(“ ”)文字列:

for (String value : values) {
    result = result + (value == null ? "" : value);
}

assertEquals("Java is great!", result);

または、 null String をチェックするコードを、 String オブジェクトを受け入れ、null[以外を返すヘルパーメソッドに抽出することもできます。 X172X] 文字列オブジェクト:

for (String value : values) {
    result = result + getNonNullString(value);
}

ここで、 getNonNullString()メソッドはヘルパーメソッドです。 入力Stringオブジェクトのnull参照をチェックするだけです。 入力オブジェクトがnullの場合は、空の(“”) String を返します。それ以外の場合は、同じStringを返します。

return value == null ? "" : value;

ただし、ご存知のとおり、StringオブジェクトはJavaでは不変です。 つまり、+演算子を使用して String オブジェクトを連結するたびに、メモリ内に新しいStringが作成されます。 したがって、連結に+演算子を使用すると、高価になります。

さらに、ヘルパーメソッドを作成するこのアプローチを使用して、他のさまざまな連結サポート操作で null Stringオブジェクトをチェックできます。 それらのいくつかを見てみましょう。

4. String.concat()Methodを使用する

String.concat()メソッドは、Stringオブジェクトを連結する場合に適しています。

ここでは、 getNonNullString()メソッドを使用して、 null オブジェクトをチェックし、空のStringを返します。

for (String value : values) {
    result = result.concat(getNonNullString(value));
}

getNonNullString()メソッドによって返される空の String は結果に連結されるため、nullオブジェクトは無視されます。

5. StringBuilderクラスの使用

StringBuilder は、便利で便利なString構築メソッドを多数提供します。 その1つがappend()メソッドです。

ここでも、同じ getNonNullString()メソッドを使用して、 append()メソッドを使用しながらnullオブジェクトを回避できます。

for (String value : values) {
    result = result.append(getNonNullString(value));
}

6. StringJoiner クラスの使用(Java 8+)

The StringJoiner クラスはのすべての機能を提供します String.join() 指定されたプレフィックスで開始し、指定されたサフィックスで終了するオプションとともに私たちはそのを使用することができます追加() 連結する方法 s。

以前と同様に、ヘルパーメソッド getNonNullString()を使用して、 null String値が連結されないようにすることができます。

StringJoiner result = new StringJoiner("");

for (String value : values) {
    result = result.add(getNonNullString(value));
}

String.join() StringJoiner の違いの1つは、 String.join()とは異なり、コレクション(A rray)をループする必要があることです。 、リスト、など)すべての要素を結合します。

7. Streams.filter (Java 8+)を使用する

Stream APIは、かなりの数の順次および並列集約操作を提供します。 そのような中間ストリーム操作の1つは、フィルターです。これは、述語を入力として受け取り、ストリームを指定されたに基づいて別のストリームに変換します。 ]述語。

したがって、Stringnull値をチェックする述語を定義し、この述語に渡すことができます。 filter()メソッド。 したがって、 filter は、元のStream。からこれらのnull値を除外します。

最後に、 Collectors.joining()を使用して、 null String 以外のすべての値を結合し、最後に、結果のStreamを収集できます。 ]を文字列変数に:

result = Stream.of(values).filter(value -> null != value).collect(Collectors.joining(""));

8. 結論

この記事では、 null Stringオブジェクトの連結を回避するためのさまざまなアプローチについて説明しました。 私たちの要件を満たすには、常に複数の正しいアプローチがあります。 したがって、特定の場所でどのアプローチが最適かを判断する必要があります。

String 自体の連結は、特にループでは、コストのかかる操作になる可能性があることに注意する必要があります。 したがって、Java StringAPIのパフォーマンスの側面を考慮することを常にお勧めします。

そしていつものように、これらの例のコードはGitHubから入手できます。