From 31221f8d1dbb221511234a8d06a4f10c2ec19d94 Mon Sep 17 00:00:00 2001 From: Nikita Golubev Date: Tue, 11 Jul 2017 18:50:08 +0300 Subject: [PATCH 1/2] Generator --- src/main/java/data/Generator.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/data/Generator.java b/src/main/java/data/Generator.java index cbd46ea..2584f86 100644 --- a/src/main/java/data/Generator.java +++ b/src/main/java/data/Generator.java @@ -60,7 +60,8 @@ public static Employee generateEmployee() { } public static List generateEmployeeList() { - // TODO - throw new UnsupportedOperationException(); + return Stream.generate(Generator::generateEmployee) + .limit(15) + .collect(toList()); } } From a76dceccb61bca3bc0c43f0c7d2dc22be12285d0 Mon Sep 17 00:00:00 2001 From: Nikita Golubev Date: Thu, 13 Jul 2017 12:10:07 +0300 Subject: [PATCH 2/2] part1 --- .../java/part1/exercise/StreamsExercise1.java | 50 ++++++-- .../java/part1/exercise/StreamsExercise2.java | 107 ++++++++++++++++-- 2 files changed, 138 insertions(+), 19 deletions(-) diff --git a/src/test/java/part1/exercise/StreamsExercise1.java b/src/test/java/part1/exercise/StreamsExercise1.java index 02dd2da..dbdb7a4 100755 --- a/src/test/java/part1/exercise/StreamsExercise1.java +++ b/src/test/java/part1/exercise/StreamsExercise1.java @@ -1,6 +1,7 @@ package part1.exercise; import data.Employee; +import data.Generator; import data.JobHistoryEntry; import data.Person; import org.junit.Test; @@ -15,6 +16,7 @@ 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 +27,43 @@ public class StreamsExercise1 { @Test public void getAllEpamEmployees() { - List epamEmployees = null;// TODO all persons with experience in epam - throw new UnsupportedOperationException(); + final List employeeList = Generator.generateEmployeeList(); + + List actualPersonList = employeeList.stream() + .filter(employee -> employee.getJobHistory().stream() + .map(JobHistoryEntry::getEmployer) + .anyMatch("epam"::equalsIgnoreCase) + ).map(Employee::getPerson) + .collect(toList()); + + List expectedPersonList = new ArrayList<>(); + for (Employee employee : employeeList) { + for (JobHistoryEntry historyEntry : employee.getJobHistory()) { + if (historyEntry.getEmployer().equalsIgnoreCase("epam")) { + expectedPersonList.add(employee.getPerson()); + break; + } + } + } + assertEquals(actualPersonList, expectedPersonList); } @Test public void getEmployeesStartedFromEpam() { - List epamEmployees = null;// TODO all persons with first experience in epam - throw new UnsupportedOperationException(); + final List employeeList = Generator.generateEmployeeList(); + List epamEmployees = employeeList.stream() + .filter(e -> e.getJobHistory().stream().limit(1).collect(toList()).get(0).getEmployer().equals("epam")) + .map(Employee::getPerson) + .collect(Collectors.toList()); + List expectedList = new ArrayList<>(); + + for (Employee anEmployeeList : employeeList) { + if (anEmployeeList.getJobHistory().get(0).getEmployer().equalsIgnoreCase("epam")) { + + expectedList.add(anEmployeeList.getPerson()); + } + } + assertEquals(expectedList, epamEmployees); } @Test @@ -49,11 +80,12 @@ public void sumEpamDurations() { } } - // TODO - throw new UnsupportedOperationException(); - - // int result = ??? - // assertEquals(expected, result); + final int result = employees.stream() + .flatMap(employee -> employee.getJobHistory().stream()) + .filter(j -> j.getEmployer().equals("epam")) + .mapToInt(JobHistoryEntry::getDuration) + .sum(); + assertEquals(expected, result); } } diff --git a/src/test/java/part1/exercise/StreamsExercise2.java b/src/test/java/part1/exercise/StreamsExercise2.java index 5be9d38..8d8074b 100755 --- a/src/test/java/part1/exercise/StreamsExercise2.java +++ b/src/test/java/part1/exercise/StreamsExercise2.java @@ -1,14 +1,14 @@ package part1.exercise; import data.Employee; +import data.Generator; import data.JobHistoryEntry; import data.Person; import org.junit.Test; +import part1.example.StreamsExample; -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; @@ -22,24 +22,111 @@ public class StreamsExercise2 { // https://youtu.be/O8oN4KSZEXE Сергей Куксенко — Stream API, часть 1 // https://youtu.be/i0Jr2l3jrDA Сергей Куксенко — Stream API, часть 2 - // TODO class PersonEmployerPair + private static class PersonPositionPair { + private final Person person; + private final String position; + + public PersonPositionPair(Person person, String position) { + this.person = person; + this.position = position; + } + + public Person getPerson() { + return person; + } + + public String getPosition() { + return position; + } + } + + private static class PersonEmployerPair { + + private final Person person; + private final String employer; + private final int duration; + + private PersonEmployerPair(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; + } + } @Test public void employersStuffLists() { - Map> employersStuffLists = null;// TODO - throw new UnsupportedOperationException(); + final List employees = Generator.generateEmployeeList(); + + Map> employersStuffLists = employees.stream() + .flatMap(employee -> employee.getJobHistory().stream() + .map(JobHistoryEntry::getPosition) + .map(s -> new PersonPositionPair(employee.getPerson(), s))) + .collect(groupingBy(PersonPositionPair::getPosition, mapping(PersonPositionPair::getPerson, toList()))); + + Map> res = new HashMap<>(); + + for (Employee employee : employees) { + for (JobHistoryEntry jobHistoryEntry : employee.getJobHistory()) { + if (res.containsKey(jobHistoryEntry.getPosition())) + res.get(jobHistoryEntry.getPosition()).add(employee.getPerson()); + else + res.put(jobHistoryEntry.getPosition(), new ArrayList<>(Collections.singletonList(employee.getPerson()))); + } + } + + assertEquals(res, employersStuffLists); } @Test public void indexByFirstEmployer() { - Map> employeesIndex = null;// TODO - throw new UnsupportedOperationException(); + final List employees = Generator.generateEmployeeList(); + + Map> employeesIndex = employees.stream() + .flatMap(employee -> employee.getJobHistory().stream() + .limit(1) + .map(JobHistoryEntry::getPosition) + .map(s -> new PersonPositionPair(employee.getPerson(), s))) + .collect(groupingBy(PersonPositionPair::getPosition, mapping(PersonPositionPair::getPerson, toList()))); + + Map> res = new HashMap<>(); + + for (Employee employee : employees) { + List jobHistory = employee.getJobHistory(); + for (JobHistoryEntry jobHistoryEntry : jobHistory) { + if (res.containsKey(jobHistoryEntry.getPosition())) + res.get(jobHistoryEntry.getPosition()).add(employee.getPerson()); + else + res.put(jobHistoryEntry.getPosition(), new ArrayList<>(Collections.singletonList(employee.getPerson()))); + break; + } + } + + assertEquals(res, employeesIndex); + } @Test public void greatestExperiencePerEmployer() { - Map employeesIndex = null;// TODO + final List employees = getEmployees(); + Map employeesIndex = employees.stream().flatMap(employee -> employee.getJobHistory().stream() + .map(j -> new PersonEmployerPair(employee.getPerson(), j.getEmployer(), j.getDuration()))) + .collect(Collectors.groupingBy(PersonEmployerPair::getEmployer, + Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparingInt(PersonEmployerPair::getDuration)), + p -> p.get().getPerson()) + )); assertEquals(new Person("John", "White", 28), employeesIndex.get("epam")); }