JavaRush /Java Blog /Random-JA /コーヒーブレイク#163。ラムダとメソッド参照の違いは何ですか。Java で文字列 Null を連結する 5 つの...

コーヒーブレイク#163。ラムダとメソッド参照の違いは何ですか。Java で文字列 Null を連結する 5 つの方法

Random-JA グループに公開済み

ラムダとメソッド参照の違いは何ですか

出典: Reddit IntelliJ IDEA は、ラムダ式をメソッド参照に置き換えることを提案しています。それらの違いは何ですか? コーヒーブレイク#163。 ラムダとメソッド参照の違いは何ですか。 Java で文字列 Null を連結する 5 つの方法 - 1ラムダ式とメソッド参照の間には微妙な違いがあることがわかりました。たとえば、myInstance::getStuff() ->myInstance.getStuff()を比較します。一般に、両方のオプションは互いに同等です。ただし、myInstance が null で、ラムダの評価時にラムダが null ポインターを生成する場合、メソッド参照は、参照にアクセスしようとするとすぐに生成されます。そして何?一般に、ラムダ式を評価するコードが null ポインターを含む try-catch 内にある場合、これは重要です。たとえば、次のような処理を行う 関数mightBeNull(Supplier<T> function)があります。
try {
    doStuff(function.get().getSomeMore().getSomeMore());
} catch (NullPointerException e) {
    doOtherStuff();
}
mightBeNull(() -> myNullVariable.getStuff())の呼び出しが例外をスローせずに機能する 場合、「同等の」: mightBeNull(myNullVariable::getStuff) は、関数が呼び出されたときにすぐに NullPointerException をスローします。それが違いです。 注記。Stackoverflow によると、ラムダをメソッド参照に置き換えると、クラスのバイトコードがよりコンパクトになり、クラスが JVM により速く読み込まれることになります。ただし、そのような利益を得るには、数千の最適化されていないラムダが必要です。ただし、大規模なプロジェクトでは、このような数は簡単に蓄積されます。それ以外の場合、ラムダとメソッド参照のどちらを選択するかは、好みとコードの読みやすさの問題になります。たとえば、ラムダに複数の行がある場合、可読性が低下し、ラムダが別のメソッドに配置され、そのラムダへの参照が使用される場合にのみコードの利点が得られます。

Java で文字列 Null を連結する 5 つの方法

出典: Gitconnected この投稿を読むと、Java で文字列を操作する方法をさらに学ぶことができます。 Java には文字列を連結するさまざまな方法が用意されていますが、NULL 文字列に注意を払わないと、明らかに望ましくない結果が NULL になってしまうことがあります。したがって、String を連結するときに null 値を回避するには、私が推奨する方法を使用してください。

問題分析

文字列配列を連結したい場合は、+ 演算子を使用するだけです。ただし、これを行うとnull値が発生する可能性があります。
String[] values = {"https", "://", "gist.", "github", ".com", null};
String result = "";

for (String value : values) {
    result = result + value;
}
これらすべての要素を組み合わせると、次の結果が得られます。
https://gist.github.comnull
問題は見つかりましたが、結果のnull 値も文字列として連結されており、これは明らかに期待していたものではありません。また、Java 8 以降で作業していても、静的なString.join()メソッドを使用して文字列を結合しても、最終的にはnull値になります。
String[] values = {"https", "://", "gist.", "github", ".com", null};
String result = String.join("", values);
結果は同じです:
https://gist.github.comnull
では、この問題をどうやって解決すればいいのでしょうか?解決策はいくつかあります。後でコードのデモを簡単にするために、文字列を渡して null 以外の文字列を返すメソッドを抽出します。
public String nullToString(String value) {
    return value == null ? "" : value;
}

1. String.concat()

String.concat() は、 Stringクラスに付属するメソッドです。文字列の連結に非常に便利です。
for (String value : values) {
    result = result.concat(getNonNullString(value));
}
nullToString()メソッドが呼び出される ため、結果としてnull値はありません。

2.文字列ビルダー

StringBuilderクラスは、文字列を構築するための便利なメソッドを多数提供します。これらの中で最も一般的に使用されるのはappend()メソッドです。このメソッドは、append()を使用して文字列を連結し、 null値 を避けるためにnullToString()メソッドと組み合わせます。
String[] values = {"https", "://", "gist.", "github", ".com", null};
StringBuilder result = new StringBuilder();

for (String value : values) {
    result = result.append(nullToString(value));
}
その結果、次の結果が得られます。
https://gist.github.com

3. StringJoiner クラス (Java 8 以降)

StringJoinerクラスは、文字列を結合するためのより強力な関数を提供します。連結時の区切り文字だけでなく、プレフィックス、サフィックスも指定できます。文字列を連結するときは、そのadd()メソッドを使用できます。nullToString()メソッドは、 null値を避けるためにここでも使用されます。
String[] values = {"https", "://", "gist.", "github", ".com", null};
StringJoiner result = new StringJoiner("");

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

4. Streams.filter (Java 8+)

Stream API は、Java 8 で導入された強力なストリーム操作クラスで、標準のフィルタリング、マッチング、トラバーサル、グループ化、統計、その他の操作を実行できます。
  • フィルタ演算filter はPredicate関数を受け取ることができます。
  • Predicate関数のインターフェイスは、以前に紹介したFunctionインターフェイスと同じです。
  • これは機能的なインターフェイスです。
  • ジェネリック パラメータ<T>を受け取ることができ、戻り値はブール型です。
  • 述語はデータのフィルターによく使用されます。
したがって、 NULL文字列をチェックする述語を定義し、それをStream API からfilter()メソッドに渡すことができます。さらに、Collectors.joining()メソッドを使用して、残りの非 null 文字列を結合できます。
String[] values = {"https", "://", "gist.", "github", ".com", null};

String result = Arrays.stream(values)
    .filter(Objects::nonNull)
    .collect(Collectors.joining());

5. + 演算子を使用する

+演算子を使用すると問題が解決される場合もありますが、お勧めしません。String は不変オブジェクトであることがわかっています。+ 記号を使用すると文字列オブジェクトが作成されることが多く、そのたびにメモリ内に新しい文字列が作成されるため、+ 記号を使用して文字列を連結するとパフォーマンスの消費が非常に高くなります。

結論

この記事では、文字列を連結して NULL を処理するためのいくつかの方法を紹介します。シナリオごとに異なる方法が適している可能性があります。分析の結果、 StringBuilder のパフォーマンスが最高であることがわかりました。ただし、実際の状況では、特定のシナリオを組み合わせて、パフォーマンスの損失が最も少ない方法を選択する必要があります。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION