diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/entities/Rating.java b/core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/entities/Rating.java new file mode 100644 index 0000000000..c4d0276256 --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/entities/Rating.java @@ -0,0 +1,39 @@ +package com.baeldung.streamreduce.entities; + +import java.util.ArrayList; +import java.util.List; + +public class Rating { + + double points; + List reviews = new ArrayList<>(); + + public Rating() {} + + public void add(Review review) { + reviews.add(review); + computeRating(); + } + + private double computeRating() { + double totalPoints = reviews.stream().map(Review::getPoints).reduce(0, Integer::sum); + this.points = totalPoints / reviews.size(); + return this.points; + } + + public static Rating average(Rating r1, Rating r2) { + Rating combined = new Rating(); + combined.reviews = new ArrayList<>(r1.reviews); + combined.reviews.addAll(r2.reviews); + combined.computeRating(); + return combined; + } + + public double getPoints() { + return points; + } + + public List getReviews() { + return reviews; + } +} diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/entities/Review.java b/core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/entities/Review.java new file mode 100644 index 0000000000..03cde8a9c8 --- /dev/null +++ b/core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/entities/Review.java @@ -0,0 +1,28 @@ +package com.baeldung.streamreduce.entities; + +public class Review { + + int points; + String review; + + public Review(int points, String review) { + this.points = points; + this.review = review; + } + + public int getPoints() { + return points; + } + + public void setPoints(int points) { + this.points = points; + } + + public String getReview() { + return review; + } + + public void setReview(String review) { + this.review = review; + } +} diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/entities/User.java b/core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/entities/User.java index 39a42beab7..20c12d7920 100644 --- a/core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/entities/User.java +++ b/core-java-modules/core-java-8/src/main/java/com/baeldung/streamreduce/entities/User.java @@ -4,6 +4,7 @@ public class User { private final String name; private final int age; + private final Rating rating = new Rating(); public User(String name, int age) { this.name = name; @@ -17,7 +18,11 @@ public class User { public int getAge() { return age; } - + + public Rating getRating() { + return rating; + } + @Override public String toString() { return "User{" + "name=" + name + ", age=" + age + '}'; diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/streamreduce/tests/StreamReduceManualTest.java b/core-java-modules/core-java-8/src/test/java/com/baeldung/streamreduce/tests/StreamReduceManualTest.java index 0bf1a5837e..602bdd069e 100644 --- a/core-java-modules/core-java-8/src/test/java/com/baeldung/streamreduce/tests/StreamReduceManualTest.java +++ b/core-java-modules/core-java-8/src/test/java/com/baeldung/streamreduce/tests/StreamReduceManualTest.java @@ -1,5 +1,7 @@ package com.baeldung.streamreduce.tests; +import com.baeldung.streamreduce.entities.Rating; +import com.baeldung.streamreduce.entities.Review; import com.baeldung.streamreduce.entities.User; import com.baeldung.streamreduce.utilities.NumberUtils; import java.util.ArrayList; @@ -64,6 +66,31 @@ public class StreamReduceManualTest { assertThat(result).isEqualTo(65); } + @Test + public void givenUserList_whenReduceWithGreaterAgeAccumulator_thenFindsOldest() { + List users = Arrays.asList(new User("John", 30), new User("Alex", 40), new User("Julie", 35)); + + User oldest = users.stream().reduce(users.get(0), (user1, user2) -> user1.getAge() >= user2.getAge() ? user1 : user2); + + assertThat(oldest).isEqualTo(users.get(1)); + } + + @Test + public void givenUserListWithRatings_whenReduceWithGreaterAgeAccumulator_thenFindsOldest() { + User john = new User("John", 30); + john.getRating().add(new Review(5, "")); + john.getRating().add(new Review(3, "not bad")); + User julie = new User("Julie", 35); + john.getRating().add(new Review(4, "great!")); + john.getRating().add(new Review(2, "terrible experience")); + john.getRating().add(new Review(4, "")); + List users = Arrays.asList(john, julie); + + Rating averageRating = users.stream().reduce(new Rating(), (rating, user) -> Rating.average(rating, user.getRating()), Rating::average); + + assertThat(averageRating.getPoints()).isEqualTo(3.6); + } + @Test public void givenStringList_whenReduceWithParallelStream_thenCorrect() { List letters = Arrays.asList("a", "b", "c", "d", "e"); diff --git a/parent-java/pom.xml b/parent-java/pom.xml index fd3028680d..5b8b7ceb9b 100644 --- a/parent-java/pom.xml +++ b/parent-java/pom.xml @@ -11,6 +11,7 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT + ../