UseCase Java Lambda Warehousehttps://www.springboot.ch/117?&atomTue, 19 Mar 2024 08:36:55 +0000stack.ch
https://stack.ch/
d7f30754-e5cb-11ee-8c11-005056bb85fbSimtech AG - Ausbildung - Java - Kurs Java Advanced - Kurs Java Advanced - Ressourcen - Kurs Java Advanced - Übungen Lambda & Stream API - UseCase Java Lambda Warehouse
https://www.springboot.ch/117
d7f3089f-e5cb-11ee-8c11-005056bb85fbTue, 19 Mar 2024 08:36:55 +0000UseCase Java Lambda Warehouse
https://www.springboot.ch/117
d7f3099c-e5cb-11ee-8c11-005056bb85fbTue, 19 Mar 2024 08:36:55 +0000
https://www.springboot.ch/117
d7f30a96-e5cb-11ee-8c11-005056bb85fbTue, 19 Mar 2024 08:36:55 +0000Ein Warenhaus führt diverse Artikel im Sortiment. Das Warehouse bietet die Liste einerseits ungefiltert aber auch gefiltert für die Abfrage an.Weiter sollen die Artikel von den Preisen und Quantitäten her via Consumer angepasst werden können.Das folgende Listing zeigt die Klasse ch.std.jpf2.lambda.stream.warehouse.Article:package ch.std.jpf2.lambda.stream.warehouse;
public class Article {
private Integer id;
private String name;
private Integer quantity;
private Double price;
public Article() {
this(null, null, null, null);
}
public Article(Integer id, String name, Integer quantity, Double price) {
this.id = id;
this.name = name;
this.quantity = quantity;
this.price = price;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getQuantity() {
return quantity;
}
public void setQuantity(Integer quantity) {
this.quantity = quantity;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
@Override
public String toString() {
return "Article [id=" + id + ", name=" + name + ", quantity=" + quantity + ", price=" + price + "]";
}
}Die Klasse ch.std.jpf2.lambda.stream.warehouse.Warehouse verwaltet die Artikel:package ch.std.jpf2.lambda.stream.warehouse;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;
public class Warehouse {
private List<Article> articles = createInitialStock();
public Warehouse() {
}
public List<Article> getArticles() {
return this.articles;
}
private static List<Article> createInitialStock() {
List<Article> result = new ArrayList<Article>();
int id = 1;
result.add(new Article(id++, "Bleistift", 75, 0.50));
result.add(new Article(id++, "Ordner", 120, 3.70));
result.add(new Article(id++, "Hefter", 45, 5.00));
result.add(new Article(id++, "Kugelschreiber", 115, 1.50));
result.add(new Article(id++, "Markierstift", 50, 2.50));
result.add(new Article(id++, "Block A4", 200, 1.75));
result.add(new Article(id++, "Block A5", 150, 1.25));
return result;
}
}
https://www.springboot.ch/117
d7f311a3-e5cb-11ee-8c11-005056bb85fbTue, 19 Mar 2024 08:36:55 +0000Die aktuelle Warehouse Klasse bietet nur die gesamte Article Liste an. Der folgende Unit Test arbeitet mit dieser Liste und filtert solche via Collection Streams:package ch.std.jpf2.lambda.stream.warehouse.test;
import java.util.List;
import java.util.stream.Collectors;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import ch.std.jpf2.lambda.stream.warehouse.Article;
import ch.std.jpf2.lambda.stream.warehouse.Warehouse;
public class ArticleFilterTest {
private Warehouse warehouse;
@BeforeEach
public void setup() {
this.warehouse = new Warehouse();
}
@Test
public void test_getAllArticles() {
List<Article> articleList = this.warehouse.getArticles();
Assertions.assertEquals(7, articleList.size());
}
@Test
public void test_getArticlesWithQuantityLess100() {
List<Article> articleListLessQuantity = this.warehouse.getArticles().stream().filter(a -> a.getQuantity() < 100).collect(Collectors.toList());
Assertions.assertEquals(3, articleListLessQuantity.size());
articleListLessQuantity.forEach(a -> Assertions.assertTrue(a.getQuantity() < 100));
}
@Test
public void test_getArticlesWithQuantityGreaterOrEqual100() {
List<Article> articleListLessQuantity = this.warehouse.getArticles().stream().filter(a -> a.getQuantity() >= 100).collect(Collectors.toList());
Assertions.assertEquals(4, articleListLessQuantity.size());
articleListLessQuantity.forEach(a -> Assertions.assertTrue(a.getQuantity() >= 100));
}
}Die Stream filter Methode arbeitet mit dem Predicate FunctionalInterface. Um ganz sicher zu sein verifizieren wir ob die gefilterten Artikel wirklich der gesuchten Regel entsprechen.Die Stream forEach Methode arbeitet hier mit dem Consumer FunctionalInterface.
https://www.springboot.ch/117
d7f31617-e5cb-11ee-8c11-005056bb85fbTue, 19 Mar 2024 08:36:55 +0000Jetzt möchten wir diesen Artikel Filter direkt über die Klasse Warehouse anbieten. Hierzu definieren wir eine 2. getArticles Methode mit dem Predicate FunctionalInterface in der Klasse Warehouse:public List<Article> getArticles(Predicate<Article> predicate) {
List<Article> result = new ArrayList<Article>();
for (Article article : this.articles) {
if (predicate.test(article)) {
result.add(article);
}
}
return result;
}Der analoge Unit Test zur Warehouse Filterung:package ch.std.jpf2.lambda.stream.warehouse.test;
import java.util.List;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import ch.std.jpf2.lambda.stream.warehouse.Article;
import ch.std.jpf2.lambda.stream.warehouse.Warehouse;
public class WarehouseFilterTest {
private Warehouse warehouse;
@BeforeEach
public void setup() {
this.warehouse = new Warehouse();
}
@Test
public void test_getArticlesWithQuantityLess100() {
List<Article> articleListLessQuantity = this.warehouse.getArticles(a -> a.getQuantity() < 100);
Assertions.assertEquals(3, articleListLessQuantity.size());
articleListLessQuantity.forEach(a -> Assertions.assertTrue(a.getQuantity() < 100));
}
@Test
public void test_getArticlesWithQuantityGreaterOrEqual100() {
List<Article> articleListLessQuantity = this.warehouse.getArticles(a -> a.getQuantity() >= 100);
Assertions.assertEquals(4, articleListLessQuantity.size());
articleListLessQuantity.forEach(a -> Assertions.assertTrue(a.getQuantity() >= 100));
}
}Die Komplexität der Filterung selbst wird ins Warehouse verschoben, die Filter Regel wird durch den Anwender definiert. Die Methode getArticles(Predicate) kann auch selbst mit Streams Filtern arbeiten:public List<Article> getArticlesStream(Predicate<Article> predicate) {
return this.articles.stream().filter(predicate).collect(Collectors.toList());
}
https://www.springboot.ch/117
d7f31d48-e5cb-11ee-8c11-005056bb85fbTue, 19 Mar 2024 08:36:55 +0000Jetzt erweitern wir das Warehouse so dass wir eine Menge von Artikeln aktualisieren können. Hierzu definieren wir die folgende Methode in der Warehouse Klasse:public void changeArticles(Predicate<Article> predicate, Consumer<Article> consumer) {
for (Article article : this.articles) {
if (predicate.test(article)) {
consumer.accept(article);
}
}
}Der folgende Unit Test erhöht die Anzahl aller Artikel um 2 Einheiten. Dann Mappen wir die Artikel auf die Liste von Quantities und prüfen das Resultat:package ch.std.jpf2.lambda.stream.warehouse.test;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import ch.std.jpf2.lambda.stream.warehouse.Warehouse;
public class WarehouseConsumerTest {
private Warehouse warehouse;
@BeforeEach
public void setup() {
this.warehouse = new Warehouse();
}
@Test
public void test_incrementQuantityBy2ForAllArticles() {
this.warehouse.changeArticles(a -> true, a -> a.setQuantity(a.getQuantity()+2));
Integer[] expected = {77, 122, 47, 117, 52, 202, 152};
Integer[] quantities = this.warehouse.getArticles().stream().map(a -> a.getQuantity()).toArray(Integer[]::new);
Assertions.assertArrayEquals(expected, quantities);
}
}
https://www.springboot.ch/117
d7f32177-e5cb-11ee-8c11-005056bb85fbTue, 19 Mar 2024 08:36:55 +0000Der UseCase zeigt den möglichen Einsatz von Functional Interface angewendet auf eigene Klassen. Wir benötigen die Funktionalität eigentlich nicht in dieser Form und könnte solche auch rein über die Artikelliste anwenden. Mit der Methode changeArticles(...) manipulieren wir eine bestehende Instanz. Dies ist in der Praxis eher nicht gern gesehen. Solche Manipulationen auf Mengen werden in der Regel über die Persistenz (z.B. SQL) gelöst.
https://www.springboot.ch/117
d7f322f3-e5cb-11ee-8c11-005056bb85fbTue, 19 Mar 2024 08:36:55 +0000Sie finden das komplette Beispiel hierÜber uns
https://www.springboot.ch/about
Tue, 19 Mar 2024 08:36:55 +0000d7f327e0-e5cb-11ee-8c11-005056bb85fbAktuell
https://www.springboot.ch/
Tue, 19 Mar 2024 08:36:55 +0000d7f3287d-e5cb-11ee-8c11-005056bb85fbAGB
https://www.springboot.ch/agb
Tue, 19 Mar 2024 08:36:55 +0000d7f3290e-e5cb-11ee-8c11-005056bb85fbBildungswege
https://www.springboot.ch/bildungswege
Tue, 19 Mar 2024 08:36:55 +0000d7f329ae-e5cb-11ee-8c11-005056bb85fbBlog
https://www.springboot.ch/blog
Tue, 19 Mar 2024 08:36:55 +0000d7f32a42-e5cb-11ee-8c11-005056bb85fbRufen Sie mich an
https://www.springboot.ch/callus
Tue, 19 Mar 2024 08:36:55 +0000d7f32ad3-e5cb-11ee-8c11-005056bb85fbCharts
https://www.springboot.ch/charts
Tue, 19 Mar 2024 08:36:55 +0000d7f32b6e-e5cb-11ee-8c11-005056bb85fbConsulting
https://www.springboot.ch/consulting
Tue, 19 Mar 2024 08:36:55 +0000d7f32c04-e5cb-11ee-8c11-005056bb85fbKontakt
https://www.springboot.ch/contact
Tue, 19 Mar 2024 08:36:55 +0000d7f32ca4-e5cb-11ee-8c11-005056bb85fbAusbildung/Kurse
https://www.springboot.ch/education
Tue, 19 Mar 2024 08:36:55 +0000d7f32d33-e5cb-11ee-8c11-005056bb85fbSoftware Engineering
https://www.springboot.ch/engineering
Tue, 19 Mar 2024 08:36:55 +0000d7f32dc6-e5cb-11ee-8c11-005056bb85fbFreelancer
https://www.springboot.ch/freelancer
Tue, 19 Mar 2024 08:36:55 +0000d7f32e53-e5cb-11ee-8c11-005056bb85fbImpressum
https://www.springboot.ch/impressum
Tue, 19 Mar 2024 08:36:55 +0000d7f32ee0-e5cb-11ee-8c11-005056bb85fbKursleiter
https://www.springboot.ch/kursleiter
Tue, 19 Mar 2024 08:36:55 +0000d7f32f6a-e5cb-11ee-8c11-005056bb85fbNetzwerk
https://www.springboot.ch/network
Tue, 19 Mar 2024 08:36:55 +0000d7f32ff5-e5cb-11ee-8c11-005056bb85fbReferenzen
https://www.springboot.ch/references
Tue, 19 Mar 2024 08:36:55 +0000d7f33085-e5cb-11ee-8c11-005056bb85fbSitemap
https://www.springboot.ch/sitemap
Tue, 19 Mar 2024 08:36:55 +0000d7f3310d-e5cb-11ee-8c11-005056bb85fbTools
https://www.springboot.ch/tools
Tue, 19 Mar 2024 08:36:55 +0000d7f33195-e5cb-11ee-8c11-005056bb85fbVision
https://www.springboot.ch/vision
Tue, 19 Mar 2024 08:36:55 +0000d7f3322a-e5cb-11ee-8c11-005056bb85fb