Loading...
MartinBG avatar MartinBG 4803 Точки

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
AnnaIvanova11 avatar AnnaIvanova11 21 Точки

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

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

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

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

1
MartinBG avatar MartinBG 4803 Точки

@AnnaIvanova11

Благодаря!

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

1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.