Migration Deep Dive für 15 · Lambda und Streams öffnen →
⌂ ÜbersichtAlle Vergleiche
Modul 15 · 100 % Codeabdeckung

Lambda und Streams

Vollständiger Legacy-Modern-Vergleich aller Java-Klassen, Tests, Maven-POMs und relevanten Ressourcen dieses Moduls. Jede Datei ist genau einmal einer fachlich passenden Vergleichsgruppe zugeordnet.

4Legacy-Dateien
4Modern-Dateien
74 → 69Codezeilen
9/9vollständig erfasst

Fachliche Einordnung

Legacy

Schleifen und mutable Akkumulatoren

Mehrere Schleifen verändern Zwischenergebnisse manuell.

Modern

Streams und Collectors

Filter, Mapping und Aggregation werden als deklarative Pipeline beschrieben.

Vergleichsfokus: Alle Dateien werden nach technischer Rolle und fachlicher Verantwortung gruppiert.
Wichtige Abgrenzung: One-to-many-Änderungen werden als Gruppe dargestellt; eine künstliche 1:1-Zuordnung wird vermieden.

Vollständige Abdeckungsmatrix

Die Ähnlichkeit ist eine technische Orientierung auf normalisiertem Quelltext. Sie ersetzt keine fachliche Bewertung.

VergleichsgruppeLegacy-DateienModern-DateienLegacy-ZeilenModern-ZeilenÄhnlichkeit
Build-Konfiguration113434100%
Domänenmodell1144100%
Analyse und Test22363127%

Gemeinsame Modulstruktur

Das Pair-POM bindet die Legacy- und Modern-Submodule zusammen und gehört deshalb ebenfalls zur vollständigen Codeabdeckung.

Gemeinsam · 19 Zeilenpom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>at.aydin.academy</groupId>
        <artifactId>java-modernization-deep-dive</artifactId>
        <version>1.0.0</version>
        <relativePath>../../pom.xml</relativePath>
    </parent>
    <artifactId>15lambdasstreams-pair</artifactId>
    <packaging>pom</packaging>
    <name>Lambda und Streams: Legacy und Modern</name>
    <modules>
        <module>legacy</module>
        <module>modern</module>
    </modules>
</project>

Alle semantischen Codevergleiche

01Build-KonfigurationDirektvergleich · Legacy 34 / Modern 34 Zeilen · Ähnlichkeit 100%

Compiler- und Testkonfiguration wird verglichen.

Legacy-DateienModern-DateienEinordnung
pom.xmlpom.xmlDirektvergleich
Semantische Ähnlichkeit: 100%

Legacy

Legacy · 34 Zeilenlegacy/pom.xml
<?xml version="1.0" encoding="UTF-8"?>
        <project xmlns="http://maven.apache.org/POM/4.0.0"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
            <modelVersion>4.0.0</modelVersion>
            <parent>
                <groupId>at.aydin.academy</groupId>
                <artifactId>15lambdasstreams-pair</artifactId>
                <version>1.0.0</version>
                <relativePath>../pom.xml</relativePath>
            </parent>
            <artifactId>streams-legacy</artifactId>
            <packaging>jar</packaging>
            <name>Streams Legacy</name>

            <dependencies>

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <scope>test</scope>
</dependency>

            </dependencies>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                    </plugin>

                </plugins>
            </build>
        </project>

Modern

Modern · 34 Zeilenmodern/pom.xml
<?xml version="1.0" encoding="UTF-8"?>
        <project xmlns="http://maven.apache.org/POM/4.0.0"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
            <modelVersion>4.0.0</modelVersion>
            <parent>
                <groupId>at.aydin.academy</groupId>
                <artifactId>15lambdasstreams-pair</artifactId>
                <version>1.0.0</version>
                <relativePath>../pom.xml</relativePath>
            </parent>
            <artifactId>streams-modern</artifactId>
            <packaging>jar</packaging>
            <name>Streams Modern</name>

            <dependencies>

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <scope>test</scope>
</dependency>

            </dependencies>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                    </plugin>

                </plugins>
            </build>
        </project>
02DomänenmodellDirektvergleich · Legacy 4 / Modern 4 Zeilen · Ähnlichkeit 100%

Bestellmodell bleibt fachlich vergleichbar.

Legacy-DateienModern-DateienEinordnung
Order.javaOrder.javaDirektvergleich
Semantische Ähnlichkeit: 100%

Legacy

Modern

03Analyse und TestDirektvergleich · Legacy 36 / Modern 31 Zeilen · Ähnlichkeit 27%

Imperative Schleifen werden Stream-Pipelines samt Tests gegenübergestellt.

Legacy-DateienModern-DateienEinordnung
LegacyOrderAnalytics.java
LegacyOrderAnalyticsTest.java
OrderAnalytics.java
OrderAnalyticsTest.java
Direktvergleich
Semantische Ähnlichkeit: 27%

Legacy

package at.aydin.lab.streams.legacy;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

// Design Pattern: Accumulator
// Zweck: Sammelt Ergebnisse imperativ in einer veränderlichen Collection.
public final class LegacyOrderAnalytics {
    public List<String> paidCustomersOver(List<Order> orders, double limit) {
        List<String> result = new ArrayList<>();
        for (Order order : orders) {
            if (order.paid()
                    && order.total() > limit
                    && !result.contains(order.customer())) {
                result.add(order.customer());
            }
        }
        Collections.sort(result);
        return result;
    }
}
package at.aydin.lab.streams.legacy;

import org.junit.jupiter.api.Test;
import java.util.*;
import static org.junit.jupiter.api.Assertions.assertEquals;

class LegacyOrderAnalyticsTest {
    @Test
    void filtersOrders() {
        var a = new LegacyOrderAnalytics();
        assertEquals(List.of("A"), a.paidCustomersOver(List.of(new Order(1, "A", 120, true), new Order(2, "B", 90, true)),
            100));
    }
}

Modern

package at.aydin.lab.streams.modern;

import java.util.*;

// Design Pattern: Pipeline
// Zweck: Filter-, Mapping- und Reduktionsschritte werden deklarativ zusammengesetzt.
public final class OrderAnalytics {
    public List<String> paidCustomersOver(List<Order> orders, double limit) {
        return orders.stream().filter(Order::paid).filter(o -> o.total() > limit).map(Order::customer).distinct()
                .sorted().toList();
    }

    public double totalRevenue(List<Order> orders) {
        return orders.stream().filter(Order::paid).mapToDouble(Order::total).sum();
    }
}
package at.aydin.lab.streams.modern;

import org.junit.jupiter.api.Test;
import java.util.*;
import static org.junit.jupiter.api.Assertions.*;

class OrderAnalyticsTest {
    @Test
    void buildsPipeline() {
        var o = List.of(new Order(1, "A", 120, true), new Order(2, "B", 90, true));
        var a = new OrderAnalytics();
        assertEquals(List.of("A"), a.paidCustomersOver(o, 100));
        assertEquals(210, a.totalRevenue(o));
    }
}
⌂ Cockpit