Java 8 (LTS)
Java 8 wurde im März 2014 veröffentlicht und ist eine LTS-Version (Long-Term Support), die bis heute in vielen Unternehmen im Einsatz ist. Es war ein Meilenstein in der Entwicklung der Sprache, da mit dieser Version erstmals funktionale Programmierkonzepte in Java Einzug hielten.
- Lambda-Ausdrücke
- Streams API
- Optional
- Neue Date/Time API (
java.time
) - Default- und Static-Methoden in Interfaces
- Wiederholbare Annotationen
- Nashorn JavaScript Engine
- Parallel Array Sort
Lambda-Ausdrücke wurden mit Java 8 eingeführt und ermöglichen eine kompakte Syntax zur Definition von Funktionen, insbesondere für funktionale Interfaces (Interfaces mit genau einer abstrakten Methode).
Beispiel:
List<String> namen = Arrays.asList("Anna", "Bernd", "Claudia");
namen.forEach(name -> System.out.println("Hallo " + name));
Erläuterung:
Statt einer anonymen Klasse wird hier mit name -> ...
ein Lambda-Ausdruck verwendet, der für jedes Element in der Liste eine Ausgabe erzeugt. Dies spart Code und verbessert die Lesbarkeit.
Streams ermöglichen eine deklarative Verarbeitung von Datenkollektionen. Sie erlauben Filter-, Map-, Reduce-Operationen und mehr – oft in Verbindung mit Lambda-Ausdrücken.
Beispiel:
List<String> namen = Arrays.asList("Anna", "Bernd", "Claudia", "Berta");
List<String> mitB = namen.stream()
.filter(name -> name.startsWith("B"))
.sorted()
.toList();
Erläuterung:
Der Code filtert alle Namen, die mit “B” beginnen, sortiert sie alphabetisch und sammelt das Ergebnis in einer neuen Liste. Der Stream erlaubt so eine elegante und funktionale Datenverarbeitung.
Die Klasse Optional<T>
ist ein Container, der entweder einen vorhandenen Wert oder keinen Wert enthalten kann. Dadurch wird der Umgang mit null
sicherer und ausdrucksstärker.
Beispiel:
Optional<String> optionalName = Optional.ofNullable(getName());
optionalName.ifPresent(name -> System.out.println("Name: " + name));
Erläuterung:
getName()
kann null
zurückgeben. Durch Optional.ofNullable()
wird das Ergebnis sicher gekapselt. Mit ifPresent()
wird die Ausgabe nur durchgeführt, wenn ein Wert vorhanden ist – ohne expliziten null
-Check.
Java 8 hat die veralteten Date
- und Calendar
-Klassen durch ein neues, immutables und thread-sicheres Zeit-API ersetzt.
Beispiel:
LocalDate heute = LocalDate.now();
LocalDate geburtstag = LocalDate.of(1990, Month.APRIL, 4);
Period alter = Period.between(geburtstag, heute);
System.out.println("Alter: " + alter.getYears());
Erläuterung:
Mit LocalDate
lassen sich Kalenderdaten einfach und sicher verarbeiten. Period.between()
berechnet die Zeitdifferenz zwischen zwei Daten – ideal zur Altersberechnung oder Laufzeitmessung.
Seit Java 8 dürfen Interfaces Methoden mit einer Standardimplementierung (default
) enthalten. Außerdem können statische Methoden definiert werden.
Beispiel:
interface Begrüßung {
default void hallo() {
System.out.println("Hallo!");
}
static void global() {
System.out.println("Globale Begrüßung");
}
}
Java 8 erlaubt es, dieselbe Annotation mehrfach an einem Ziel zu verwenden. Dazu wird die Annotation mit @Repeatable
markiert.
Beispiel:
@Hint("A")
@Hint("B")
class MyClass {}
@Repeatable(Hints.class)
@interface Hint {
String value();
}
@interface Hints {
Hint[] value();
}
Java 8 brachte die neue JavaScript-Engine Nashorn mit, die es erlaubt, JavaScript direkt innerhalb von Java auszuführen.
Beispiel:
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.eval("print('Hallo aus JavaScript');");
Hinweis: Nashorn wurde in Java 15 entfernt.
Mit Java 8 wurde Arrays.parallelSort()
eingeführt, das große Arrays schneller sortieren kann, indem es parallele Threads nutzt.
Beispiel:
int[] zahlen = {5, 3, 8, 1, 9};
Arrays.parallelSort(zahlen);
System.out.println(Arrays.toString(zahlen));