From 1a4cd2fa557476e4d4ea30c406a0e54630affc16 Mon Sep 17 00:00:00 2001 From: Andrei Andronov Date: Tue, 11 Jul 2017 17:16:20 +0300 Subject: [PATCH 1/5] part1 StreamExercise1 was done --- src/main/java/data/Generator.java | 7 +++- .../java/part1/exercise/StreamsExercise1.java | 38 +++++++++++-------- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/main/java/data/Generator.java b/src/main/java/data/Generator.java index cbd46ea..25919ca 100644 --- a/src/main/java/data/Generator.java +++ b/src/main/java/data/Generator.java @@ -1,5 +1,6 @@ package data; +import java.util.ArrayList; import java.util.List; import java.util.concurrent.ThreadLocalRandom; import java.util.stream.Collectors; @@ -60,7 +61,9 @@ public static Employee generateEmployee() { } public static List generateEmployeeList() { - // TODO - throw new UnsupportedOperationException(); + List list = new ArrayList<>(); + list.add(new Employee(generatePerson(), generateJobHistory())); + list.add(new Employee(generatePerson(), generateJobHistory())); + return list; } } diff --git a/src/test/java/part1/exercise/StreamsExercise1.java b/src/test/java/part1/exercise/StreamsExercise1.java index 02dd2da..70c570a 100755 --- a/src/test/java/part1/exercise/StreamsExercise1.java +++ b/src/test/java/part1/exercise/StreamsExercise1.java @@ -2,19 +2,14 @@ import data.Employee; import data.JobHistoryEntry; -import data.Person; import org.junit.Test; -import java.util.*; -import java.util.concurrent.ThreadLocalRandom; -import java.util.stream.Collectors; +import java.util.List; import java.util.stream.IntStream; -import java.util.stream.Stream; import static data.Generator.generateEmployeeList; -import static java.util.stream.Collectors.groupingBy; -import static java.util.stream.Collectors.mapping; import static java.util.stream.Collectors.toList; +import static org.junit.Assert.assertEquals; public class StreamsExercise1 { // https://youtu.be/kxgo7Y4cdA8 Сергей Куксенко и Алексей Шипилёв — Через тернии к лямбдам, часть 1 @@ -25,14 +20,24 @@ public class StreamsExercise1 { @Test public void getAllEpamEmployees() { - List epamEmployees = null;// TODO all persons with experience in epam - throw new UnsupportedOperationException(); + List employees = generateEmployeeList();// all persons with experience in epam + + List epamEmployees = employees.stream() + .filter(employee -> employee.getJobHistory().stream() + .anyMatch(jobHistory -> jobHistory.getEmployer().equals("epam"))) + .collect(toList()); } @Test public void getEmployeesStartedFromEpam() { - List epamEmployees = null;// TODO all persons with first experience in epam - throw new UnsupportedOperationException(); + List employees = generateEmployeeList();// all persons with first experience in epam + + List epamEmployees = employees.stream() + .filter(employee -> employee.getJobHistory().stream() + .findFirst() + .filter(jobHistory -> jobHistory.getEmployer().equals("epam")) + .isPresent()) + .collect(toList()); } @Test @@ -49,11 +54,12 @@ public void sumEpamDurations() { } } - // TODO - throw new UnsupportedOperationException(); - - // int result = ??? - // assertEquals(expected, result); + int result = employees.stream() + .flatMapToInt(employee -> employee.getJobHistory().stream() + .filter(jobHistory -> jobHistory.getEmployer().equals("epam")) + .flatMapToInt(jobHistory -> IntStream.of(jobHistory.getDuration()))) + .sum(); + assertEquals(expected, result); } } From 19602188db81371df2f9831e173210df0400c329 Mon Sep 17 00:00:00 2001 From: andrei Date: Tue, 11 Jul 2017 22:18:29 +0300 Subject: [PATCH 2/5] part1 StreamExercise1 was refactored --- .../java/part1/exercise/StreamsExercise1.java | 37 +++++++++++++------ 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/src/test/java/part1/exercise/StreamsExercise1.java b/src/test/java/part1/exercise/StreamsExercise1.java index 70c570a..e17884a 100755 --- a/src/test/java/part1/exercise/StreamsExercise1.java +++ b/src/test/java/part1/exercise/StreamsExercise1.java @@ -4,8 +4,8 @@ import data.JobHistoryEntry; import org.junit.Test; +import java.util.Collection; import java.util.List; -import java.util.stream.IntStream; import static data.Generator.generateEmployeeList; import static java.util.stream.Collectors.toList; @@ -20,26 +20,35 @@ public class StreamsExercise1 { @Test public void getAllEpamEmployees() { - List employees = generateEmployeeList();// all persons with experience in epam + List employees = generateEmployeeList(); // all persons with experience in epam List epamEmployees = employees.stream() - .filter(employee -> employee.getJobHistory().stream() - .anyMatch(jobHistory -> jobHistory.getEmployer().equals("epam"))) + .filter(this::workedInEpam) .collect(toList()); } + private boolean workedInEpam(Employee employee) { + return employee.getJobHistory().stream() + .map(JobHistoryEntry::getEmployer) + .anyMatch("epam"::equals); + } + @Test public void getEmployeesStartedFromEpam() { List employees = generateEmployeeList();// all persons with first experience in epam List epamEmployees = employees.stream() - .filter(employee -> employee.getJobHistory().stream() - .findFirst() - .filter(jobHistory -> jobHistory.getEmployer().equals("epam")) - .isPresent()) + .filter(this::workedFirstlyInEpam) .collect(toList()); } + private boolean workedFirstlyInEpam(Employee employee) { + return employee.getJobHistory().stream() + .findFirst() + .filter("epam"::equals) + .isPresent(); + } + @Test public void sumEpamDurations() { final List employees = generateEmployeeList(); @@ -55,11 +64,17 @@ public void sumEpamDurations() { } int result = employees.stream() - .flatMapToInt(employee -> employee.getJobHistory().stream() - .filter(jobHistory -> jobHistory.getEmployer().equals("epam")) - .flatMapToInt(jobHistory -> IntStream.of(jobHistory.getDuration()))) + .map(Employee::getJobHistory) + .flatMap(Collection::stream) + .filter(this::epamJobHistoryEntry) + .mapToInt(JobHistoryEntry::getDuration) .sum(); + assertEquals(expected, result); } + private boolean epamJobHistoryEntry(JobHistoryEntry jobHistoryEntry) { + return jobHistoryEntry.getEmployer().equals("epam"); + } + } From 93258c472812f7caf1350b5b8e94ceb22836ebef Mon Sep 17 00:00:00 2001 From: andrei Date: Tue, 11 Jul 2017 23:54:59 +0300 Subject: [PATCH 3/5] part1 StreamExercise2 was started --- src/main/java/data/Generator.java | 11 +++--- .../java/part1/exercise/StreamsExercise2.java | 39 +++++++++++++++---- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/src/main/java/data/Generator.java b/src/main/java/data/Generator.java index 25919ca..f5e76d1 100644 --- a/src/main/java/data/Generator.java +++ b/src/main/java/data/Generator.java @@ -1,6 +1,5 @@ package data; -import java.util.ArrayList; import java.util.List; import java.util.concurrent.ThreadLocalRandom; import java.util.stream.Collectors; @@ -61,9 +60,11 @@ public static Employee generateEmployee() { } public static List generateEmployeeList() { - List list = new ArrayList<>(); - list.add(new Employee(generatePerson(), generateJobHistory())); - list.add(new Employee(generatePerson(), generateJobHistory())); - return list; + int maxLength = 10; + final int length = ThreadLocalRandom.current().nextInt(maxLength) + 1; + + return Stream.generate(Generator::generateEmployee) + .limit(length) + .collect(toList()); } } diff --git a/src/test/java/part1/exercise/StreamsExercise2.java b/src/test/java/part1/exercise/StreamsExercise2.java index 5be9d38..69ae1b6 100755 --- a/src/test/java/part1/exercise/StreamsExercise2.java +++ b/src/test/java/part1/exercise/StreamsExercise2.java @@ -5,14 +5,10 @@ import data.Person; import org.junit.Test; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; import java.util.stream.Stream; -import static data.Generator.generateEmployeeList; -import static java.util.stream.Collectors.*; import static org.junit.Assert.assertEquals; public class StreamsExercise2 { @@ -23,11 +19,38 @@ public class StreamsExercise2 { // https://youtu.be/i0Jr2l3jrDA Сергей Куксенко — Stream API, часть 2 // TODO class PersonEmployerPair + private static class PersonEmployerPair { + private Person person; + private String employer; + + public PersonEmployerPair(Person person, String employer) { + this.person = person; + this.employer = employer; + } + + public Person getPerson() { + return person; + } + + public String getEmployer() { + return employer; + } + } @Test public void employersStuffLists() { - Map> employersStuffLists = null;// TODO - throw new UnsupportedOperationException(); + Stream personEmployerPairStream = getEmployees().stream() + .flatMap(this::toPersonEmployerPair); + + Map> employersStuffLists = personEmployerPairStream + .collect(Collectors.groupingBy( + PersonEmployerPair::getEmployer, + Collectors.mapping(PersonEmployerPair::getPerson, Collectors.toSet()))); + } + + private Stream toPersonEmployerPair(Employee employee) { + return employee.getJobHistory().stream() + .map(jhe -> new PersonEmployerPair(employee.getPerson(), jhe.getEmployer())); } @Test From 622c0084c39bdb624302cbddaad9a30dd99aad6e Mon Sep 17 00:00:00 2001 From: Andrei Andronov Date: Wed, 12 Jul 2017 17:25:29 +0300 Subject: [PATCH 4/5] part1 StreamExercise2 without last method --- .../java/part1/exercise/StreamsExercise2.java | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/test/java/part1/exercise/StreamsExercise2.java b/src/test/java/part1/exercise/StreamsExercise2.java index 69ae1b6..064590b 100755 --- a/src/test/java/part1/exercise/StreamsExercise2.java +++ b/src/test/java/part1/exercise/StreamsExercise2.java @@ -9,8 +9,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static org.junit.Assert.assertEquals; - public class StreamsExercise2 { // https://youtu.be/kxgo7Y4cdA8 Сергей Куксенко и Алексей Шипилёв — Через тернии к лямбдам, часть 1 // https://youtu.be/JRBWBJ6S4aU Сергей Куксенко и Алексей Шипилёв — Через тернии к лямбдам, часть 2 @@ -55,17 +53,32 @@ private Stream toPersonEmployerPair(Employee employee) { @Test public void indexByFirstEmployer() { - Map> employeesIndex = null;// TODO - throw new UnsupportedOperationException(); + Stream personFirstEmployerPairStream = getEmployees().stream() + .flatMap(this::toPersonAndFirstEmployerPair); + + Map> employeesIndex = personFirstEmployerPairStream + .collect(Collectors.groupingBy( + PersonEmployerPair::getEmployer, + Collectors.mapping(PersonEmployerPair::getPerson, Collectors.toSet()))); } + private Stream toPersonAndFirstEmployerPair(Employee employee) { + return employee.getJobHistory().stream() + .limit(1) + .map(jhe -> new PersonEmployerPair(employee.getPerson(), jhe.getEmployer())); + } @Test public void greatestExperiencePerEmployer() { - Map employeesIndex = null;// TODO + Stream personGreatestEmployerPairStream = getEmployees().stream() + .flatMap(this::toPersonAndFirstEmployerPair); - assertEquals(new Person("John", "White", 28), employeesIndex.get("epam")); - } +// Map> employeesIndex = personGreatestEmployerPairStream +// .collect(Collectors.groupingBy( +// PersonEmployerPair::getEmployer, +// Collectors.maxBy(Comparator.comparingInt()))); +// assertEquals(new Person("John", "White", 28), employeesIndex.get("epam")); + } private List getEmployees() { return Arrays.asList( From 3dd91afde64d2f0164079587087a85dabfe28994 Mon Sep 17 00:00:00 2001 From: Andrei Andronov Date: Thu, 13 Jul 2017 11:41:12 +0300 Subject: [PATCH 5/5] part1 done --- .../java/part1/exercise/StreamsExercise2.java | 55 +++++++++++++++---- 1 file changed, 45 insertions(+), 10 deletions(-) diff --git a/src/test/java/part1/exercise/StreamsExercise2.java b/src/test/java/part1/exercise/StreamsExercise2.java index 064590b..5873b41 100755 --- a/src/test/java/part1/exercise/StreamsExercise2.java +++ b/src/test/java/part1/exercise/StreamsExercise2.java @@ -9,6 +9,10 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import static java.util.Comparator.comparingInt; +import static java.util.stream.Collectors.*; +import static org.junit.Assert.assertEquals; + public class StreamsExercise2 { // https://youtu.be/kxgo7Y4cdA8 Сергей Куксенко и Алексей Шипилёв — Через тернии к лямбдам, часть 1 // https://youtu.be/JRBWBJ6S4aU Сергей Куксенко и Алексей Шипилёв — Через тернии к лямбдам, часть 2 @@ -41,7 +45,7 @@ public void employersStuffLists() { .flatMap(this::toPersonEmployerPair); Map> employersStuffLists = personEmployerPairStream - .collect(Collectors.groupingBy( + .collect(groupingBy( PersonEmployerPair::getEmployer, Collectors.mapping(PersonEmployerPair::getPerson, Collectors.toSet()))); } @@ -50,14 +54,13 @@ private Stream toPersonEmployerPair(Employee employee) { return employee.getJobHistory().stream() .map(jhe -> new PersonEmployerPair(employee.getPerson(), jhe.getEmployer())); } - @Test public void indexByFirstEmployer() { Stream personFirstEmployerPairStream = getEmployees().stream() .flatMap(this::toPersonAndFirstEmployerPair); Map> employeesIndex = personFirstEmployerPairStream - .collect(Collectors.groupingBy( + .collect(groupingBy( PersonEmployerPair::getEmployer, Collectors.mapping(PersonEmployerPair::getPerson, Collectors.toSet()))); } @@ -67,17 +70,49 @@ private Stream toPersonAndFirstEmployerPair(Employee employe .limit(1) .map(jhe -> new PersonEmployerPair(employee.getPerson(), jhe.getEmployer())); } + + private static class PersonEmployerDuration { + + private final Person person; + private final String employer; + private final int duration; + public PersonEmployerDuration(Person person, String employer, int duration) { + this.person = person; + this.employer = employer; + this.duration = duration; + } + + public Person getPerson() { + return person; + } + + public String getEmployer() { + return employer; + } + + public int getDuration() { + return duration; + } + + } + + private Stream toPersonEmployerDuration(Employee employee) { + return employee.getJobHistory().stream() + .map(jhe -> new PersonEmployerDuration(employee.getPerson(), jhe.getEmployer(), jhe.getDuration())); + } + @Test public void greatestExperiencePerEmployer() { - Stream personGreatestEmployerPairStream = getEmployees().stream() - .flatMap(this::toPersonAndFirstEmployerPair); + Stream personEmployerDurationStream = getEmployees().stream() + .flatMap(this::toPersonEmployerDuration); -// Map> employeesIndex = personGreatestEmployerPairStream -// .collect(Collectors.groupingBy( -// PersonEmployerPair::getEmployer, -// Collectors.maxBy(Comparator.comparingInt()))); + Map employeesIndex = personEmployerDurationStream + .collect(groupingBy(PersonEmployerDuration::getEmployer, + collectingAndThen( + maxBy(comparingInt(PersonEmployerDuration::getDuration)), + o -> o.get().getPerson()))); -// assertEquals(new Person("John", "White", 28), employeesIndex.get("epam")); + assertEquals(new Person("John", "White", 28), employeesIndex.get("epam")); } private List getEmployees() {