Професионална програма
Loading...
+ Нов въпрос
MartinBG avatar MartinBG 2792 Точки

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-та задача laugh

Ето една идея по-изчистено решение (директно създаване 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 репото с останалите задачи.

Тагове:
3
Java Advanced 03/01/2020 05:13:24
GenadiMihaylov avatar GenadiMihaylov 10 Точки

Чест и почитания, колега!

Много добър и полезен материал!

Поздрави: Генади

1
MartinBG avatar MartinBG 2792 Точки

Благодаря!

Радвам се, че постът ми е бил полезен! 

 

1
18/10/2017 15:19:32
AnnaIvanova11 avatar AnnaIvanova11 20 Точки

Много, полезен пост !!! Благодаря !

p.s. Дали би могъл да препоръчаш, някой допълнителен подходящ материал, за начинаещи.

1
14/03/2020 00:10:24
AnnaIvanova11 avatar AnnaIvanova11 20 Точки

@MartinBG искам да кажа едно благодаря за тази тема, която ме запали по stream-api в Java и като цяло за цялата помощ, която си ми указвал винаги по темите. Днес си нацъках трета задача със stream-ове за 15/20 мин. благодарение на това. Та за прогреса ми в това отношение благодаря супер много и че винаги си на линия тук и отговаряш толкова изчерпателно!!!

1