JavaRush /Java-Blog /Random-DE /Kaffeepause Nr. 163. Was ist der Unterschied zwischen ein...

Kaffeepause Nr. 163. Was ist der Unterschied zwischen einem Lambda und einer Methodenreferenz? 5 Möglichkeiten, String-Null in Java zu verketten

Veröffentlicht in der Gruppe Random-DE

Was ist der Unterschied zwischen einem Lambda und einer Methodenreferenz?

Quelle: Reddit IntelliJ IDEA schlägt vor, Lambda-Ausdrücke durch Methodenreferenzen zu ersetzen. Was ist der Unterschied zwischen ihnen? Kaffeepause Nr. 163.  Was ist der Unterschied zwischen einem Lambda und einer Methodenreferenz?  5 Möglichkeiten, String-Null in Java zu verketten – 1Es stellt sich heraus, dass es einen subtilen Unterschied zwischen Lambda-Ausdrücken und Methodenreferenzen gibt. Vergleichen Sie zum Beispiel: myInstance::getStuff und () ->myInstance.getStuff() . Im Allgemeinen sind beide Optionen einander gleichwertig. Wenn myInstance jedoch null ist und das Lambda bei der Auswertung des Lambda einen Nullzeiger erzeugt, wird beim Versuch, auf die Referenz zuzugreifen, sofort eine Methodenreferenz generiert. Na und? Im Allgemeinen ist dies wichtig, wenn der Code, der den Lambda-Ausdruck auswertet, sich in einem Try-Catch mit einem Nullzeiger befindet. Ich habe zum Beispiel eine Funktion mightBeNull(Supplier<T> function) , die etwa Folgendes tut:
try {
    doStuff(function.get().getSomeMore().getSomeMore());
} catch (NullPointerException e) {
    doOtherStuff();
}
Wenn der Aufruf von mightBeNull(() -> myNullVariable.getStuff()) funktionieren würde, ohne eine Ausnahme auszulösen, dann wirft das „Äquivalent“: mightBeNull(myNullVariable::getStuff) sofort eine NullPointerException aus, wenn die Funktion aufgerufen wird. Das ist der Unterschied. Notiz. Wenn Sie das Lambda durch eine Methodenreferenz ersetzen, wird laut Stackoverflow der Klassenbytecode kompakter, was bedeutet, dass die Klasse schneller in die JVM geladen wird. Um einen solchen Gewinn zu erzielen, sind jedoch Tausende nicht optimierter Lambdas erforderlich. Bei einem großen Projekt kann sich eine solche Anzahl jedoch leicht ansammeln. Ansonsten ist die Wahl zwischen einem Lambda und einer Methodenreferenz eine Frage des Geschmacks und der Lesbarkeit des Codes. Wenn ein Lambda beispielsweise mehrere Zeilen hat, ist die Lesbarkeit eingeschränkt und der Code profitiert nur, wenn das Lambda in einer separaten Methode platziert und ein Verweis darauf verwendet wird.

5 Möglichkeiten, String-Null in Java zu verketten

Quelle: Gitconnected Nachdem Sie diesen Beitrag gelesen haben, erfahren Sie mehr über die Arbeit mit Strings in Java. Java bietet viele Möglichkeiten, Strings zu verketten, aber manchmal, wenn wir nicht auf Null-Strings achten, können wir mit Null enden, was offensichtlich nicht das ist, was wir wollen. Verwenden Sie daher meine empfohlenen Methoden, um beim Verketten von Strings Nullwerte zu vermeiden.

Problemanalyse

Wenn wir String-Arrays verketten möchten, können wir einfach den +-Operator verwenden. Allerdings können wir dabei auf Nullwerte stoßen .
String[] values = {"https", "://", "gist.", "github", ".com", null};
String result = "";

for (String value : values) {
    result = result + value;
}
Die Kombination all dieser Elemente führt uns zu diesem Ergebnis:
https://gist.github.comnull
Obwohl wir das Problem gefunden haben, wird der resultierende Nullwert auch als Zeichenfolge verkettet, was eindeutig nicht das ist, was wir uns erhofft hatten . Und selbst wenn wir mit Java 8 oder höher arbeiten und die statische String.join()- Methode zum Verbinden von Zeichenfolgen verwenden, erhalten wir am Ende immer noch Nullwerte .
String[] values = {"https", "://", "gist.", "github", ".com", null};
String result = String.join("", values);
Das Ergebnis ist das gleiche:
https://gist.github.comnull
Wie kann man dieses Problem lösen? Es gibt mehrere Lösungen. Um die spätere Demonstration des Codes zu erleichtern, extrahieren wir eine Methode, die eine Zeichenfolge übergeben und eine Zeichenfolge ungleich Null zurückgeben kann.
public String nullToString(String value) {
    return value == null ? "" : value;
}

1. String.concat()

String.concat() ist eine Methode, die mit der String- Klasse geliefert wird . Es ist sehr praktisch für die Verkettung von Zeichenfolgen.
for (String value : values) {
    result = result.concat(getNonNullString(value));
}
Da die Methode nullToString() aufgerufen wird, gibt es als Ergebnis keine Nullwerte .

2.StringBuilder

Die StringBuilder- Klasse bietet viele nützliche und praktische Methoden zum Erstellen von Strings. Die am häufigsten verwendete Methode ist die append()- Methode , die append() zum Verketten von Zeichenfolgen verwendet und mit der nullToString()- Methode kombiniert wird , um Nullwerte zu vermeiden .
String[] values = {"https", "://", "gist.", "github", ".com", null};
StringBuilder result = new StringBuilder();

for (String value : values) {
    result = result.append(nullToString(value));
}
Als Ergebnis können Sie das folgende Ergebnis erhalten:
https://gist.github.com

3. StringJoiner-Klasse (Java 8+)

Die StringJoiner- Klasse bietet eine leistungsfähigere Funktion zum Verbinden von Zeichenfolgen. Es kann nicht nur das Trennzeichen während der Verkettung angeben, sondern auch das Präfix und Suffix. Beim Verketten von Zeichenfolgen können wir die Methode add() verwenden . Auch hier wird die Methode nullToString() verwendet, um Nullwerte zu vermeiden .
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+)

Die Stream-API ist eine leistungsstarke Stream-Operationsklasse, die in Java 8 eingeführt wurde und standardmäßige Filter-, Matching-, Traversal-, Gruppierungs-, Statistik- und andere Operationen durchführen kann.
  • Der Filteroperationsfilter kann eine Prädikatfunktion erhalten .
  • Die Schnittstelle der Prädikatfunktion ist dieselbe wie die zuvor eingeführte Funktionsschnittstelle .
  • Dies ist eine funktionale Schnittstelle.
  • Es kann einen generischen Parameter <T> annehmen und der Rückgabewert ist ein boolescher Typ.
  • Prädikat wird häufig zum Filtern von Daten verwendet .
Wir können also ein Prädikat definieren , um nach einer Nullzeichenfolge zu suchen , und es von der Stream-API an die filter()- Methode übergeben . Darüber hinaus können Sie die Methode Collectors.joining() verwenden, um die verbleibenden Nicht-Null-Strings zu verbinden.
String[] values = {"https", "://", "gist.", "github", ".com", null};

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

5. Verwenden Sie den +-Operator

Die Verwendung des + -Operators kann das Problem ebenfalls lösen, wird jedoch nicht empfohlen. Wir wissen, dass String ein unveränderliches Objekt ist. Durch die Verwendung des +-Zeichens wird häufig ein Zeichenfolgenobjekt erstellt, und jedes Mal wird eine neue Zeichenfolge im Speicher erstellt. Daher ist der Leistungsverbrauch bei der Verwendung des +-Zeichens zum Verketten von Zeichenfolgen sehr hoch.

Abschluss

In diesem Artikel werden verschiedene Methoden zum Verketten von Zeichenfolgen und zum Umgang mit NULL-Werten vorgestellt, wobei unterschiedliche Methoden für unterschiedliche Szenarien geeignet sein können. Die Analyse zeigt, dass die Leistung von StringBuilder die beste ist. Unter realen Bedingungen müssen Sie jedoch bestimmte Szenarien kombinieren und dann die Methode mit dem geringsten Leistungsverlust auswählen.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION