Streams API Exercises - решения на задачите с използване на стриймове
На упранението не бяха демонстрирани решения със стриймове на първите 9 задачи, а решенията, които открих на колеги в GitHub преобладаващо използват помощен клас. Това в никакъв случай не е лош подход за конкретните проблеми, но просто не отговаря на целите на упражнението, а именно - да се запознаем с възможностите на Streams API и да видим как се прилага на практика.
Понеже тази тема беше доста незадоволително покрита на лекциите и на упражненията, и понеже едва ли ще видим референтни решения на проблемите, реших да споделя моите решения на задачите, като съм се стремил да използвам само и единствено streams (всъщност един единствен стрийм) за всяко от решенията.
Най-вероятно някои от решенията ми не използват най-добрите практики за постигане на целта (например в 9-та задача използвам междинно преобразуване до Map<String, TreeSet<String>>, който веднага обръщам на stream от EntrySet - ако някой има по-добро решение ще се радвам да го видя!), но поне дават някаква представа за работата със стриймове в Java и вярвам, че ще са от полза за колегите, които като мен се опитват да научат езика.
Задача 1 - StudentsByGroup
Задача 2 - StudentsByFirstAndLastName
Задача 3 - StudentsByAge
Задача 4 - SortStudents
Задача 5 - FilterStudentsByEmailDomain
Задача 6 - FilterStudentsByPhone
Задача 7 - ExcellentStudents
Задача 8 - WeakStudents
Задача 9 - StudentsByEnrollmentYear
Update (03.01.2019)
2+ години по-късно се сетих отново за 9-та задача
Ето една идея по-изчистено решение (директно създаване TreeMap, вместо HashMap, който после да бъде сортиран):
import java.io.BufferedReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.stream.Collectors;
public class Pr09StudentsByEnrollmentYearSimplified {
public static void main(String[] args) {
final String dataFile = "src\\Lesson07BuiltInQueryMethodsStreamAPI\\Resources\\StudentData.txt";
try (BufferedReader br = Files.newBufferedReader(Paths.get(dataFile))) {
br.lines()
.skip(1)
.map(line -> line.split("\\s+"))
.collect(
Collectors.groupingBy(
tokens -> "20" + tokens[0].substring(4) + ":",
TreeMap::new,
Collectors.mapping(
tokens -> "-- " + tokens[1] + " " + tokens[2],
Collectors.toCollection(TreeSet::new)
)
)
)
.forEach((enrollmentYear, students) -> {
System.out.println(enrollmentYear);
students.forEach(System.out::println);
});
} catch (IOException e) {
e.printStackTrace();
}
}
}
Линк към GitHub репото с останалите задачи.
Благодаря!
Радвам се, че постът ми е бил полезен!