From 50df5f4ec008433b4414bdea8e504f214959d526 Mon Sep 17 00:00:00 2001 From: Olga Li Date: Thu, 13 Jul 2017 09:56:47 +0300 Subject: [PATCH 1/3] part1 (Olga Li) --- src/main/java/data/Generator.java | 10 ++- .../java/part1/exercise/StreamsExercise1.java | 90 ++++++++++++++++--- 2 files changed, 85 insertions(+), 15 deletions(-) diff --git a/src/main/java/data/Generator.java b/src/main/java/data/Generator.java index cbd46ea..5c338a8 100644 --- a/src/main/java/data/Generator.java +++ b/src/main/java/data/Generator.java @@ -6,6 +6,7 @@ import java.util.stream.IntStream; import java.util.stream.Stream; +import static java.util.stream.Collectors.reducing; import static java.util.stream.Collectors.toList; /** @@ -60,7 +61,12 @@ public static Employee generateEmployee() { } public static List generateEmployeeList() { - // TODO - throw new UnsupportedOperationException(); + // TODO - done + 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/StreamsExercise1.java b/src/test/java/part1/exercise/StreamsExercise1.java index 02dd2da..f9178e0 100755 --- a/src/test/java/part1/exercise/StreamsExercise1.java +++ b/src/test/java/part1/exercise/StreamsExercise1.java @@ -6,15 +6,11 @@ import org.junit.Test; import java.util.*; -import java.util.concurrent.ThreadLocalRandom; import java.util.stream.Collectors; -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 +21,54 @@ public class StreamsExercise1 { @Test public void getAllEpamEmployees() { - List epamEmployees = null;// TODO all persons with experience in epam - throw new UnsupportedOperationException(); + List employees = generateEmployeeList(); + + List expectedEpamEmployees = new ArrayList<>(); + for (Employee e : employees) { + for (JobHistoryEntry j : e.getJobHistory()) { + if (j.getEmployer().equals("epam")) { + expectedEpamEmployees.add(e.getPerson()); + } + } + } + + // TODO all persons with experience in epam - done + List epamEmployees = employees.stream() + .flatMap(e -> e.getJobHistory() + .stream() + .map(j -> new PersonEmployerDuration(e.getPerson(), j.getEmployer(), j.getDuration()))) + .filter(p -> p.getEmployer().equals("epam")) + .map(p -> p.getPerson()) + .collect(Collectors.toList()); + + assertEquals(expectedEpamEmployees, epamEmployees); } @Test public void getEmployeesStartedFromEpam() { - List epamEmployees = null;// TODO all persons with first experience in epam - throw new UnsupportedOperationException(); + List employees = generateEmployeeList(); + + List expectedStartedInEpamEmployees = new ArrayList<>(); + for (Employee e : employees) { + Optional job = e.getJobHistory().stream().findFirst(); + if (job.isPresent()) { + if (job.get().getEmployer().equals("epam")) { + expectedStartedInEpamEmployees.add(e.getPerson()); + } + } + } + + // TODO all persons with first experience in epam - done + List startedInEpamEmployees = employees.stream() + .flatMap(e -> e.getJobHistory() + .stream() + .limit(1) + .map(j -> new PersonEmployerDuration(e.getPerson(), j.getEmployer(), j.getDuration()))) + .filter(j -> j.getEmployer().equals("epam")) + .map(p -> p.getPerson()) + .collect(Collectors.toList()); + + assertEquals(expectedStartedInEpamEmployees, startedInEpamEmployees); } @Test @@ -49,11 +85,39 @@ public void sumEpamDurations() { } } - // TODO - throw new UnsupportedOperationException(); + // TODO - done - // int result = ??? - // assertEquals(expected, result); + int result = employees.stream() + .flatMap(employee -> employee.getJobHistory().stream()) + .filter(jobHistoryEntry -> jobHistoryEntry.getEmployer().equals("epam")) + .mapToInt(JobHistoryEntry::getDuration) + .sum(); + + assertEquals(expected, result); + } + + 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; + } } } From d77064f3db55fd1b6f09e023ae9e0e9b4ca7a792 Mon Sep 17 00:00:00 2001 From: Olya Lee Date: Sun, 16 Jul 2017 18:55:56 +0300 Subject: [PATCH 2/3] part1 - exercise 2 (Olga Li) --- .../java/part1/exercise/StreamsExercise1.java | 2 +- .../java/part1/exercise/StreamsExercise2.java | 84 +++++++++++++++---- 2 files changed, 70 insertions(+), 16 deletions(-) diff --git a/src/test/java/part1/exercise/StreamsExercise1.java b/src/test/java/part1/exercise/StreamsExercise1.java index f9178e0..26af045 100755 --- a/src/test/java/part1/exercise/StreamsExercise1.java +++ b/src/test/java/part1/exercise/StreamsExercise1.java @@ -96,7 +96,7 @@ public void sumEpamDurations() { assertEquals(expected, result); } - private static class PersonEmployerDuration { + static class PersonEmployerDuration { private final Person person; private final String employer; private final int duration; diff --git a/src/test/java/part1/exercise/StreamsExercise2.java b/src/test/java/part1/exercise/StreamsExercise2.java index 5be9d38..a0fb82f 100755 --- a/src/test/java/part1/exercise/StreamsExercise2.java +++ b/src/test/java/part1/exercise/StreamsExercise2.java @@ -5,14 +5,9 @@ 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.stream.Stream; - -import static data.Generator.generateEmployeeList; -import static java.util.stream.Collectors.*; +import java.util.*; +import java.util.stream.Collectors; + import static org.junit.Assert.assertEquals; public class StreamsExercise2 { @@ -22,28 +17,44 @@ public class StreamsExercise2 { // https://youtu.be/O8oN4KSZEXE Сергей Куксенко — Stream API, часть 1 // https://youtu.be/i0Jr2l3jrDA Сергей Куксенко — Stream API, часть 2 - // TODO class PersonEmployerPair + // TODO class PersonEmployerPair - done @Test public void employersStuffLists() { - Map> employersStuffLists = null;// TODO - throw new UnsupportedOperationException(); + // TODO - Map> employersStuffLists = getEmployees().stream() + .flatMap(employee -> employee.getJobHistory().stream() + .map(jobHistoryEntry -> new PersonEmployerPair(employee.getPerson(), jobHistoryEntry.getEmployer()))) + .collect(Collectors.groupingBy(PersonEmployerPair::getEmployer, + Collectors.mapping(PersonEmployerPair::getPerson, Collectors.toList()))); } @Test public void indexByFirstEmployer() { - Map> employeesIndex = null;// TODO - throw new UnsupportedOperationException(); + // TODO - get only if first job - done + Map> employeesIndex = getEmployees().stream() + .flatMap(employee -> employee.getJobHistory().stream().limit(1) + .map(jobHistoryEntry -> new PersonEmployerPair(employee.getPerson(), jobHistoryEntry.getEmployer()))) + .collect(Collectors.groupingBy(PersonEmployerPair::getEmployer, + Collectors.mapping(PersonEmployerPair::getPerson, Collectors.toList()))); } @Test public void greatestExperiencePerEmployer() { - Map employeesIndex = null;// TODO + // TODO - Map(company, person with longest duration) - done + Map employeesIndex = getEmployees().stream() + .flatMap(employee -> employee.getJobHistory() + .stream().map(jobHistoryEntry -> new PersonEmployerDuration(employee.getPerson(), jobHistoryEntry.getEmployer(), jobHistoryEntry.getDuration()))) + .collect(Collectors.groupingBy(PersonEmployerDuration::getEmployer, + Collectors.collectingAndThen( + Collectors.maxBy(Comparator.comparingInt(PersonEmployerDuration::getDuration)), p -> p.get().getPerson()))); assertEquals(new Person("John", "White", 28), employeesIndex.get("epam")); } + + private List getEmployees() { return Arrays.asList( new Employee( @@ -121,4 +132,47 @@ private List getEmployees() { ); } -} + private static class PersonEmployerPair { + private final Person person; + private final String employer; + + public PersonEmployerPair(Person person, String employer) { + this.person = person; + this.employer = employer; + } + + public Person getPerson() { + return person; + } + + public String getEmployer() { + return employer; + } + + } + + 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; + } + } + +} \ No newline at end of file From 515f89efbf68fe8821d59d7352f02a5b621d6210 Mon Sep 17 00:00:00 2001 From: Olya Lee Date: Sun, 16 Jul 2017 22:17:19 +0300 Subject: [PATCH 3/3] part2 - exercise 1 - getCoolestByPostion (Olga Li) --- .../part2/exercise/CollectorsExercise1.java | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/test/java/part2/exercise/CollectorsExercise1.java b/src/test/java/part2/exercise/CollectorsExercise1.java index 46b6765..c7a8735 100755 --- a/src/test/java/part2/exercise/CollectorsExercise1.java +++ b/src/test/java/part2/exercise/CollectorsExercise1.java @@ -3,20 +3,11 @@ import data.Employee; import data.JobHistoryEntry; import data.Person; +import org.junit.Assert; import org.junit.Test; import java.util.*; -import java.util.concurrent.ThreadLocalRandom; -import java.util.function.BiConsumer; -import java.util.function.BinaryOperator; -import java.util.function.Function; -import java.util.function.Supplier; -import java.util.stream.Collector; import java.util.stream.Collectors; -import java.util.stream.IntStream; -import java.util.stream.Stream; - -import static java.util.stream.Collectors.toList; public class CollectorsExercise1 { @@ -25,6 +16,8 @@ public void getTheCoolestOne() { final Map coolestByPosition = getCoolestByPosition(getEmployees()); coolestByPosition.forEach((position, person) -> System.out.println(position + " -> " + person)); + + Assert.assertEquals(new Person("John", "White", 28), coolestByPosition.get("BA")); } private static class PersonPositionDuration { @@ -57,12 +50,16 @@ private Map getCoolestByPosition(List employees) { // Collectors.maxBy // Collectors.collectingAndThen // Collectors.groupingBy + return employees.stream() + .flatMap(e -> e.getJobHistory().stream() + .map(j -> new PersonPositionDuration(e.getPerson(), j.getPosition(), j.getDuration()))) + .collect(Collectors.groupingBy(PersonPositionDuration::getPosition, + Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparingInt(PersonPositionDuration::getDuration)), p -> p.get().getPerson()))); // Second option // Collectors.toMap // iterate twice: stream...collect(...).stream()... - // TODO - throw new UnsupportedOperationException(); + // TODO - done } @Test @@ -76,6 +73,12 @@ public void getTheCoolestOne2() { // { John Doe, [{dev, google, 4}, {dev, epam, 4}] } предпочтительнее, чем { A B, [{dev, google, 6}, {QA, epam, 100}]} private Map getCoolestByPosition2(List employees) { // TODO +// employees.stream() +// .flatMap(e->e.getJobHistory().stream() +// .map(j->new PersonPositionDuration(e.getPerson(), j.getPosition(), j.getDuration()))) +// .collect(Collectors.groupingBy(PersonPositionDuration::getPosition, +// Collectors.collectingAndThen(Collectors.summarizingInt(PersonPositionDuration::getDuration), + throw new UnsupportedOperationException(); }