From 14516616d7388750f6c48177a9f44fffb1d9b89e Mon Sep 17 00:00:00 2001 From: ReduxR <177857999+ReduxR@users.noreply.github.com> Date: Tue, 24 Mar 2026 15:08:03 +0100 Subject: [PATCH 1/3] Candidate validator created and stream practice assingments done --- .../java/practice/CandidateValidator.java | 28 +++++++++++- src/main/java/practice/StreamPractice.java | 45 ++++++++++++++++--- 2 files changed, 65 insertions(+), 8 deletions(-) diff --git a/src/main/java/practice/CandidateValidator.java b/src/main/java/practice/CandidateValidator.java index 8d2e56c0e..3604edb77 100644 --- a/src/main/java/practice/CandidateValidator.java +++ b/src/main/java/practice/CandidateValidator.java @@ -1,5 +1,31 @@ package practice; -public class CandidateValidator { +import java.util.function.Predicate; +import java.util.stream.Stream; +import model.Candidate; + +public class CandidateValidator implements Predicate { //write your code here + @Override + public boolean test(Candidate candidate) { + if (candidate == null) { + return false; + } + if (candidate.getAge() < 35) { + return false; + } + if (!candidate.isAllowedToVote()) { + return false; + } + if (!"Ukrainian".equals(candidate.getNationality())) { + return false; + } + + int yearsInUkraine = Stream.of(candidate.getPeriodsInUkr()) + .map(period -> period.split("-")) + .mapToInt(arr -> Integer.parseInt(arr[1]) - Integer.parseInt(arr[0])) + .sum(); + + return yearsInUkraine >= 10; + } } diff --git a/src/main/java/practice/StreamPractice.java b/src/main/java/practice/StreamPractice.java index 57b1ca2e2..a3989e1bc 100644 --- a/src/main/java/practice/StreamPractice.java +++ b/src/main/java/practice/StreamPractice.java @@ -1,8 +1,12 @@ package practice; -import java.util.Collections; +import java.util.Arrays; import java.util.List; +import java.util.NoSuchElementException; +import java.util.stream.Collectors; +import java.util.stream.IntStream; import model.Candidate; +import model.Cat; import model.Person; public class StreamPractice { @@ -14,7 +18,12 @@ public class StreamPractice { * "Can't get min value from list: < Here is our input 'numbers' >" */ public int findMinEvenNumber(List numbers) { - return 0; + return numbers.stream() + .flatMap(n -> Arrays.stream(n.split(","))) + .map(Integer::valueOf) + .filter(num -> num % 2 == 0) + .min(Integer::compareTo) + .orElseThrow(() -> new RuntimeException("Can't get min value from list.")); } /** @@ -23,7 +32,10 @@ public int findMinEvenNumber(List numbers) { * But before that subtract 1 from each element on an odd position (having the odd index). */ public Double getOddNumsAverage(List numbers) { - return 0D; + return IntStream.range(0, numbers.size()) + .map(i -> i % 2 != 0 ? numbers.get(i) - 1 : numbers.get(i)) + .filter(n -> n % 2 != 0) + .average().orElseThrow(NoSuchElementException::new); } /** @@ -35,7 +47,10 @@ public Double getOddNumsAverage(List numbers) { * Example: select men who can be recruited to army (from 18 to 27 years old inclusively). */ public List selectMenByAge(List peopleList, int fromAge, int toAge) { - return Collections.emptyList(); + return peopleList.stream() + .filter(person -> person.getAge() >= fromAge && person.getAge() <= toAge + && person.getSex().equals(Person.Sex.MAN)) + .collect(Collectors.toList()); } /** @@ -50,7 +65,11 @@ public List selectMenByAge(List peopleList, int fromAge, int toA */ public List getWorkablePeople(int fromAge, int femaleToAge, int maleToAge, List peopleList) { - return Collections.emptyList(); + return peopleList.stream() + .filter(person -> person.getSex().equals(Person.Sex.MAN) + ? person.getAge() >= fromAge && person.getAge() <= maleToAge + : person.getAge() >= fromAge && person.getAge() <= femaleToAge) + .collect(Collectors.toList()); } /** @@ -59,7 +78,13 @@ public List getWorkablePeople(int fromAge, int femaleToAge, * return the names of all cats whose owners are women from `femaleAge` years old inclusively. */ public List getCatsNames(List peopleList, int femaleAge) { - return Collections.emptyList(); + return peopleList.stream() + .filter(person -> person.getSex().equals(Person.Sex.WOMAN) + && person.getAge() >= femaleAge) + .flatMap(person -> person.getCats().stream()) + .map(Cat::getName) + .collect(Collectors.toList()); + } /** @@ -75,6 +100,12 @@ public List getCatsNames(List peopleList, int femaleAge) { * parametrized with Candidate in CandidateValidator. */ public List validateCandidates(List candidates) { - return Collections.emptyList(); + CandidateValidator candidateValidator = new CandidateValidator(); + + return candidates.stream() + .filter(candidateValidator) + .map(Candidate::getName) + .sorted() + .collect(Collectors.toList()); } } From 9d7bf9b7ae8332e7bad21962ca517b821a268bfe Mon Sep 17 00:00:00 2001 From: ReduxR <177857999+ReduxR@users.noreply.github.com> Date: Tue, 24 Mar 2026 15:24:04 +0100 Subject: [PATCH 2/3] magic numbers removed + findMinEvenNumber fixed --- src/main/java/practice/CandidateValidator.java | 10 +++++++--- src/main/java/practice/StreamPractice.java | 5 +++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/practice/CandidateValidator.java b/src/main/java/practice/CandidateValidator.java index 3604edb77..c244e4d64 100644 --- a/src/main/java/practice/CandidateValidator.java +++ b/src/main/java/practice/CandidateValidator.java @@ -5,19 +5,23 @@ import model.Candidate; public class CandidateValidator implements Predicate { + private static final String REQUIRED_NATIONALITY = "Ukrainian"; + private static final int MIN_CANDIDATE_AGE = 35; + private static final int MIN_YEARS_IN_UKRAINE = 10; + //write your code here @Override public boolean test(Candidate candidate) { if (candidate == null) { return false; } - if (candidate.getAge() < 35) { + if (candidate.getAge() < MIN_CANDIDATE_AGE) { return false; } if (!candidate.isAllowedToVote()) { return false; } - if (!"Ukrainian".equals(candidate.getNationality())) { + if (!REQUIRED_NATIONALITY.equals(candidate.getNationality())) { return false; } @@ -26,6 +30,6 @@ public boolean test(Candidate candidate) { .mapToInt(arr -> Integer.parseInt(arr[1]) - Integer.parseInt(arr[0])) .sum(); - return yearsInUkraine >= 10; + return yearsInUkraine >= MIN_YEARS_IN_UKRAINE; } } diff --git a/src/main/java/practice/StreamPractice.java b/src/main/java/practice/StreamPractice.java index a3989e1bc..ef770762b 100644 --- a/src/main/java/practice/StreamPractice.java +++ b/src/main/java/practice/StreamPractice.java @@ -20,10 +20,11 @@ public class StreamPractice { public int findMinEvenNumber(List numbers) { return numbers.stream() .flatMap(n -> Arrays.stream(n.split(","))) - .map(Integer::valueOf) + .map(num -> Integer.valueOf(num.trim())) .filter(num -> num % 2 == 0) .min(Integer::compareTo) - .orElseThrow(() -> new RuntimeException("Can't get min value from list.")); + .orElseThrow(() -> + new RuntimeException("Can't get min value from list: " + numbers)); } /** From f01b2e4a986cf98222cafd8cdf6a2afbab23346f Mon Sep 17 00:00:00 2001 From: ReduxR <177857999+ReduxR@users.noreply.github.com> Date: Wed, 25 Mar 2026 15:09:43 +0100 Subject: [PATCH 3/3] test method in CandidateValidator class updated + removed redundant Collectors calls in StreamPractice --- .../java/practice/CandidateValidator.java | 17 ++++++---------- src/main/java/practice/StreamPractice.java | 20 ++++++++++--------- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/main/java/practice/CandidateValidator.java b/src/main/java/practice/CandidateValidator.java index c244e4d64..e33b8bc67 100644 --- a/src/main/java/practice/CandidateValidator.java +++ b/src/main/java/practice/CandidateValidator.java @@ -6,6 +6,7 @@ public class CandidateValidator implements Predicate { private static final String REQUIRED_NATIONALITY = "Ukrainian"; + private static final String HYPHEN = "-"; private static final int MIN_CANDIDATE_AGE = 35; private static final int MIN_YEARS_IN_UKRAINE = 10; @@ -15,21 +16,15 @@ public boolean test(Candidate candidate) { if (candidate == null) { return false; } - if (candidate.getAge() < MIN_CANDIDATE_AGE) { - return false; - } - if (!candidate.isAllowedToVote()) { - return false; - } - if (!REQUIRED_NATIONALITY.equals(candidate.getNationality())) { - return false; - } int yearsInUkraine = Stream.of(candidate.getPeriodsInUkr()) - .map(period -> period.split("-")) + .map(period -> period.split(HYPHEN)) .mapToInt(arr -> Integer.parseInt(arr[1]) - Integer.parseInt(arr[0])) .sum(); - return yearsInUkraine >= MIN_YEARS_IN_UKRAINE; + return candidate.getAge() >= MIN_CANDIDATE_AGE + && candidate.isAllowedToVote() + && REQUIRED_NATIONALITY.equals(candidate.getNationality()) + && yearsInUkraine >= MIN_YEARS_IN_UKRAINE; } } diff --git a/src/main/java/practice/StreamPractice.java b/src/main/java/practice/StreamPractice.java index ef770762b..c501523c0 100644 --- a/src/main/java/practice/StreamPractice.java +++ b/src/main/java/practice/StreamPractice.java @@ -3,13 +3,14 @@ import java.util.Arrays; import java.util.List; import java.util.NoSuchElementException; -import java.util.stream.Collectors; import java.util.stream.IntStream; import model.Candidate; import model.Cat; import model.Person; public class StreamPractice { + private static final String COMMA = ","; + /** * Given list of strings where each element contains 1+ numbers: * input = {"5,30,100", "0,22,7", ...} @@ -19,7 +20,7 @@ public class StreamPractice { */ public int findMinEvenNumber(List numbers) { return numbers.stream() - .flatMap(n -> Arrays.stream(n.split(","))) + .flatMap(n -> Arrays.stream(n.split(COMMA))) .map(num -> Integer.valueOf(num.trim())) .filter(num -> num % 2 == 0) .min(Integer::compareTo) @@ -36,7 +37,8 @@ public Double getOddNumsAverage(List numbers) { return IntStream.range(0, numbers.size()) .map(i -> i % 2 != 0 ? numbers.get(i) - 1 : numbers.get(i)) .filter(n -> n % 2 != 0) - .average().orElseThrow(NoSuchElementException::new); + .average() + .orElseThrow(NoSuchElementException::new); } /** @@ -49,9 +51,10 @@ public Double getOddNumsAverage(List numbers) { */ public List selectMenByAge(List peopleList, int fromAge, int toAge) { return peopleList.stream() - .filter(person -> person.getAge() >= fromAge && person.getAge() <= toAge + .filter(person -> person.getAge() >= fromAge + && person.getAge() <= toAge && person.getSex().equals(Person.Sex.MAN)) - .collect(Collectors.toList()); + .toList(); } /** @@ -70,7 +73,7 @@ public List getWorkablePeople(int fromAge, int femaleToAge, .filter(person -> person.getSex().equals(Person.Sex.MAN) ? person.getAge() >= fromAge && person.getAge() <= maleToAge : person.getAge() >= fromAge && person.getAge() <= femaleToAge) - .collect(Collectors.toList()); + .toList(); } /** @@ -84,7 +87,7 @@ public List getCatsNames(List peopleList, int femaleAge) { && person.getAge() >= femaleAge) .flatMap(person -> person.getCats().stream()) .map(Cat::getName) - .collect(Collectors.toList()); + .toList(); } @@ -102,11 +105,10 @@ public List getCatsNames(List peopleList, int femaleAge) { */ public List validateCandidates(List candidates) { CandidateValidator candidateValidator = new CandidateValidator(); - return candidates.stream() .filter(candidateValidator) .map(Candidate::getName) .sorted() - .collect(Collectors.toList()); + .toList(); } }