Schleifen und mutable Akkumulatoren
Mehrere Schleifen verändern Zwischenergebnisse manuell.
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.
Mehrere Schleifen verändern Zwischenergebnisse manuell.
Filter, Mapping und Aggregation werden als deklarative Pipeline beschrieben.
Die Ähnlichkeit ist eine technische Orientierung auf normalisiertem Quelltext. Sie ersetzt keine fachliche Bewertung.
| Vergleichsgruppe | Legacy-Dateien | Modern-Dateien | Legacy-Zeilen | Modern-Zeilen | Ähnlichkeit |
|---|---|---|---|---|---|
| Build-Konfiguration | 1 | 1 | 34 | 34 | 100% |
| Domänenmodell | 1 | 1 | 4 | 4 | 100% |
| Analyse und Test | 2 | 2 | 36 | 31 | 27% |
Das Pair-POM bindet die Legacy- und Modern-Submodule zusammen und gehört deshalb ebenfalls zur vollständigen Codeabdeckung.
Compiler- und Testkonfiguration wird verglichen.
| Legacy-Dateien | Modern-Dateien | Einordnung |
|---|---|---|
| pom.xml | pom.xml | Direktvergleich Semantische Ähnlichkeit: 100% |
<?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><?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>Bestellmodell bleibt fachlich vergleichbar.
| Legacy-Dateien | Modern-Dateien | Einordnung |
|---|---|---|
| Order.java | Order.java | Direktvergleich Semantische Ähnlichkeit: 100% |
package at.aydin.lab.streams.legacy;
public record Order(long id, String customer, double total, boolean paid) {
}package at.aydin.lab.streams.modern;
public record Order(long id, String customer, double total, boolean paid) {
}Imperative Schleifen werden Stream-Pipelines samt Tests gegenübergestellt.
| Legacy-Dateien | Modern-Dateien | Einordnung |
|---|---|---|
| LegacyOrderAnalytics.java LegacyOrderAnalyticsTest.java | OrderAnalytics.java OrderAnalyticsTest.java | Direktvergleich Semantische Ähnlichkeit: 27% |
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));
}
}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));
}
}