© DrHitch/Shutterstock.com
Java 9 Streams

5 Kleinere Streams-Pattern-Beispiele


Im Folgenden zeige ich anhand von drei kleineren Beispielen, was mit Java 9 Streams unter anderem machbar ist.

5.1 Ist es eine Primzahl?

Als kleines Anfangsbeispiel hier eine Implementierung, mit der sich herausfinden lässt, ob es sich bei einer Zahl um eine Primzahl handelt. Die Methode isPrime2 ist ohne Streams realisiert, isPrime1 ist das mittels Stream realisierte Äquivalent. Bei dieser recht einfachen Implementierung ist der Unterschied zwischen den Implementierungen noch recht klein. Es zeigt aber schon die unterschiedliche Lesbarkeit, meines Erachtens nach zugunsten der Stream-Version (Listing 5.1).

public static void main(String[] args) {
for(int i = 0; i<1_000_000; i++){
final boolean b = isPrime1(i) != isPrime2(i);
if(b)
System.out.println("ungleiches Ergebnis = " + i);
}
}
public static boolean isPrime1(int n) {
if (n <= 1) return false;
if (n == 2) return true;
return n >= 2 && IntStream
.rangeClosed(2, (int) (Math.sqrt(n)))
.allMatch((d) -> n % d != 0);
}
public static boolean isPrime2(int n) {
if (n <= 1) return false;
if (n == 2) return true;
if (n % 2 == 0) return false;
for (int i = 3; i <= Math.sqrt(n) + 1; i = i + 2) {
if (n % i == 0) return false;
}
return true;
}

Listing 5.1

5.2 Fibonacci als Stream

Einem Stream kann man einen Supplier als Instanz übergeben. Das bedeutet auch, dass dort immer dieselbe Instanz verwendet wird, solange der Stream verwendet wird. Das kann man verwenden, um z. B. aufeinander aufbauende Zahlenfolgen zu generieren. In Listing 5.2 erfolgt eine triviale Implementierung, um Fibonacci-Zahlen zu erzeugen.

public static void main(String[] args) {
final Stream<Long> fibStream = makeFibStream(10);
fibStream.forEachOrdered(System.out::println);
}
public static Stream<Long> makeFibStream() {
return(Stream.generate(new FibonacciSupplier()));
}
public static Stream<Long> makeFibStream(int numFibs) {
return(makeFibStream().limit(numFibs));
}
public static List<Long> makeFibList(int numFibs) {
return(makeFibStream(numFibs)
.collect(Collectors.toList()));
}
public static class FibonacciSupplier implements Supplier<Long> {
private long previous = 0;
private long current = 1;
@Override
public Long get() {
long next = current + previous;
previous = current;
current = next;
return(previous);
}
}

Listing 5.2

Hier gibt es allerdings einige Nachteile, oder besser gesagt Dinge, die auf jeden Fall berücksichtigt werden müssen.

Wenn eine Supplier-Instanz erzeugt wird, muss sichergestellt sein, dass diese nicht zur Erzeugung von mehr als einem S...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang