Die Java 8 Stream-Verarbeitung kann bisher weggelassen werden!

Wie Sie wissen, ermöglicht ** Stream **, das in Java 8 hinzugefügt wurde, das Schreiben einer funktionalen sprachähnlichen Verarbeitung auch in Java (mehr als 3 Jahre sind seit der Veröffentlichung im Jahr 2014 zum Zeitpunkt des Schreibens des Artikels vergangen). Es ist lange her, aber ...). [^ 1] Da es einen Mechanismus gibt, um Code präzise zu schreiben, gibt es keinen Grund, ihn nicht zu verwenden. Hier werden wir nach und nach den Code weglassen, der den einfachen Prozess der Konvertierung von "List " in "List <Integer" ausführt, und den Unterschied zeigen.

Einführung

Die folgenden Begriffe gelten als bereits verstanden und werden hier nicht erläutert.

Wenn Sie ein schnelles Verständnis wünschen, werden die folgenden Artikel empfohlen.

Java 7 oder früher

Schreiben wir zunächst mit Legacy-Code vor Java 7.

Verwenden Sie erweitert für Anweisung

final List<String> numTextList = Arrays.asList("0", "1", null);

final List<Integer> numList = new ArrayList<>();
for(final String numText : numTextList){
  if(numText == null){
    continue;
  }
  final int num = Integer.parseInt(numText);
	numList.add(num);
}

Verarbeitungseinheit: 8 Zeilen / 149 Zeichen

Die erweiterte for-Anweisung ist moderner als die reguläre for-Anweisung, aber es ist nicht cool, den Elementtyp schreiben zu müssen. Es ist auch gefährlich, dass "numList" mit einer leeren Liste initialisiert wird und während der iterativen Verarbeitung Nebenwirkungen auf externe Variablen hat.

Java 8 oder höher

Ab hier schreibe ich ab Java 8 modernen Code.

Verwenden Sie Stream

final List<String> numTextList = Arrays.asList("0", "1", null);

final List<Integer> numList = numTextList.stream()
		.filter((String numText) -> {
			return Objects.nonNull(numText);
		})
		.map((String numText) -> {
			return Integer.parseInt(numText);
		})
		.collect(Collectors.toList());

Verarbeitungseinheit: 8 Zeilen / 197 Zeichen

Mit Stream können Sie jetzt direkt "numList" erstellen. Dies ist jedoch ein ziemlich redundanter Schreibstil, und es kann nicht gesagt werden, dass er die Güte von Stream am besten nutzt.

Lassen Sie den Namen des Argumenttyps weg

final List<String> numTextList = Arrays.asList("0", "1", null);

final List<Integer> numList = numTextList.stream()
		.filter((numText) -> {
			return Objects.nonNull(numText);
		})
		.map((numText) -> {
			return Integer.parseInt(numText);
		})
		.collect(Collectors.toList());

Verarbeitungseinheit: 8 Zeilen / 183 Zeichen

In Lambda-Ausdrücken können Sie Typnamen weglassen, die durch Typinferenz abgeleitet werden können.

Lassen Sie die Klammern im Argumentteil weg

final List<String> numTextList = Arrays.asList("0", "1", null);

final List<Integer> numList = numTextList.stream()
		.filter(numText -> {
			return Objects.nonNull(numText);
		})
		.map(numText -> {
			return Integer.parseInt(numText);
		})
		.collect(Collectors.toList());

Verarbeitungseinheit: 8 Zeilen / 179 Zeichen

In Lambda-Ausdrücken können Sie die das Argument umgebenden Klammern weglassen, wenn es ein Argument gibt.

Lassen Sie die wellenförmigen Klammern im Verarbeitungsbereich weg

final List<String> numTextList = Arrays.asList("0", "1", null);

final List<Integer> numList = numTextList.stream()
		.filter(numText -> Objects.nonNull(numText))
		.map(numText -> Integer.parseInt(numText))
		.collect(Collectors.toList());

Verarbeitungseinheit: 4 Zeilen / 145 Zeichen

In Lambda-Ausdrücken können Sie die wellenförmigen Klammern und die return-Anweisung weglassen, wenn der Prozessor in eine Zeile schreiben kann. Erst als ich hierher kam, hatte ich weniger Zeichen als Java 7 und früher. Wenn Sie jeden Prozess in eine Zeile schreiben, ist der Zusammenhang der Methodenkette leicht zu verstehen.

Variablenname verkürzen

final List<String> numTextList = Arrays.asList("0", "1", null);

final List<Integer> numList = numTextList.stream()
		.filter(s -> Objects.nonNull(s))
		.map(s -> Integer.parseInt(s))
		.collect(Collectors.toList());

Verarbeitungseinheit: 4 Zeilen / 121 Zeichen

Lambda-Ausdrucksvariablen werden nur im laufenden Betrieb verwendet, sodass Variablennamen durch einen einzelnen Buchstaben dargestellt werden können. In diesem Fall ist es einfacher zu verstehen, ob Sie den ersten Buchstaben des Typnamens oder den ersten Buchstaben des ursprünglichen Variablennamens verwenden. Ich denke, dieses Format ist ein vertrauter Schreibstil, aber es ist immer noch optional.

Verwenden Sie die Methodenreferenz

final List<String> numTextList = Arrays.asList("0", "1", null);

final List<Integer> numList = numTextList.stream()
		.filter(Objects::nonNull)
		.map(Integer::parseInt)
		.collect(Collectors.toList());

Verarbeitungseinheit: 4 Zeilen / 107 Zeichen

Wenn die Argument-Signaturen (Typen und ihre Reihenfolge) übereinstimmen, können Sie Methodenreferenzen anstelle von Lambda-Ausdrücken verwenden. Ich denke, die Vereinfachung des Codes hat den Prozessablauf klarer gemacht.

abschließend

Wenn Sie es zu sehr weglassen, kann es schwierig sein, es zu verstehen. In meinem Fall schreibe ich grundsätzlich in einen Lambda-Ausdruck, aber wenn die Methodenreferenz nützlich ist (Objects :: nonNull, Path :: toFile usw.), verwende ich sie. Auf jeden Fall möchte ich versuchen, gut lesbaren Code zu schreiben.

Referenzlink

[^ 1]: [Neue API und Erweiterungs-API, die Lambda-Ausdrücke und Streams in Java SE 8 verwendet](http://docs.oracle.com/javase/jp/8/docs/technotes/guides/language/lambda_api_jdk8 .html)

Recommended Posts

Die Java 8 Stream-Verarbeitung kann bisher weggelassen werden!
Grundlegender Verarbeitungsablauf von Java Stream
[Java] Stream-Verarbeitung
[Java] Stream API - Stream-Beendigungsverarbeitung
[Java] Stream API - Stream Zwischenverarbeitung
Java Stream kann nicht wiederverwendet werden.
Zusammenfassung der Java-Fehlerverarbeitung
Nur der Stream der obersten Ebene kann mit Java Stream parallelisiert werden.
Über Lambda, Stream, LocalDate von Java8
Zusammenfassung von ORM "uroboroSQL", das in Enterprise Java verwendet werden kann
Eingabe / Ausgabe von Java-Dateien, die über den historischen Hintergrund verwendet werden können
Datenverarbeitung mit der Stream-API von Java 8
[Processing x Java] Erstellen einer Entwicklungsumgebung
Dinge, die Sie beim Schreiben von Java beachten sollten
[Java] Kurzschlüsse beachten (Kurzschlussauswertung)
[Hinweis] Java: Geschwindigkeit der Verarbeitung der Liste nach Zweck
Der [Java] char-Typ kann in den int-Typ umgewandelt werden
Java Servlet sollte die Multithread-Umgebung kennen