diff --git a/hw-02/README.md b/hw-02/README.md new file mode 100644 index 0000000..c7e2e42 --- /dev/null +++ b/hw-02/README.md @@ -0,0 +1,29 @@ +# Homework 02 + +1. Создать класс Student, обязательное поле класса Student - List (минимум по 5 книг у каждого) + +2. Создать текстовый файл со студентами и книгами + +3. При помощи внутренних фреймворков и библиотек для ввода-вывода информации в Java считать содержимое файла и заполнить List этими данными (Должен быть реализован механизм заполнения коллекции студентов из текстового файла) + +4. При помощи одного (не допускается объявления никаких промежуточных переменных, совсем никаких) стрима: + + Вывести в консоль каждого студента (переопределите toString) + + Получить для каждого студента список книг + + Получить книги + + Отсортировать книги по количеству страниц (Не забывайте про условия для сравнения объектов) + + Оставить только уникальные книги + + Отфильтровать книги, оставив только те, которые были выпущены после 2000 года + + Ограничить стрим на 3 элементах + + Получить из книг годы выпуска + + При помощи методов короткого замыкания (почитайте самостоятельно что это такое) вернуть Optional от года + + При помощи методов получения значения из Optional вывести в консоль год выпуска найденной книги, либо запись о том, что такая книга отсутствует diff --git a/hw-02/student-reader/pom.xml b/hw-02/student-reader/pom.xml new file mode 100644 index 0000000..4042717 --- /dev/null +++ b/hw-02/student-reader/pom.xml @@ -0,0 +1,39 @@ + + 4.0.0 + com.example + student-reader + jar + 1.0-SNAPSHOT + student-reader + http://maven.apache.org + + + + junit + junit + 3.8.1 + test + + + + com.fasterxml.jackson.core + jackson-databind + 2.20.0 + + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + 2.20.0 + + + + + + 21 + 21 + + + diff --git a/hw-02/student-reader/src/main/java/com/example/App.java b/hw-02/student-reader/src/main/java/com/example/App.java new file mode 100644 index 0000000..ace3e9c --- /dev/null +++ b/hw-02/student-reader/src/main/java/com/example/App.java @@ -0,0 +1,71 @@ +package com.example; + +import java.io.IOException; +import java.nio.file.Path; +import java.time.Year; +import java.util.Comparator; +import java.util.List; + +public class App { + + public static void main(String[] args) { + + try { + + Path studentsJsonFile = Path.of("students.json"); + List students = StudentReader.read(studentsJsonFile); + + // Условие использования одного stream сохраняется + students.stream() + + // Вывести в консоль каждого студента (переопределите toString) + .peek(System.out::println) + + // Получить для каждого студента список книг + .map(s -> s.getBooks()) // Stream> + + // Получить книги + .flatMap(List::stream) // Stream; + + // Oтсортировать книги по количеству страниц (Не забывайте про условия для сравнения + // объектов) + .sorted(Comparator.comparingInt(Book::getPageCount)) + + // Оставить только уникальные книги + .distinct() + + // Отфильтровать книги, оставив только те, которые были выпущены после 2000 года + .filter(b -> b.getPublishYear().isAfter(Year.of(2000))) + + // Ограничить стрим на 3 элементах + .limit(3) + + // Получить из книг годы выпуска + .map(Book::getPublishYear) + + // При помощи методов короткого замыкания (почитайте самостоятельно что это такое) вернуть + // Optional от года + .findFirst() + + // При помощи методов получения значения из Optional вывести в консоль год выпуска + // найденной книги, либо запись о том, что такая книга отсутствует + .ifPresentOrElse( + year -> System.out.println("Год выпуска: " + year), + () -> System.out.println("Подходящая книга отсутствует")); + + } catch (IOException e) { + + System.err.println("Сударь, вы передали неправильный файл!"); + e.printStackTrace(); + System.exit(1); + + } catch (Exception e) { + + System.err.println("Ну тут мои полномочии всё!"); + e.printStackTrace(); + System.exit(1); + } + + System.out.println("Выполнение программы завершено"); + } +} diff --git a/hw-02/student-reader/src/main/java/com/example/Book.java b/hw-02/student-reader/src/main/java/com/example/Book.java new file mode 100644 index 0000000..a6e8afd --- /dev/null +++ b/hw-02/student-reader/src/main/java/com/example/Book.java @@ -0,0 +1,72 @@ +package com.example; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.time.Year; +import java.util.Objects; + +public class Book { + + @JsonCreator + public Book( + @JsonProperty("author") String author, + @JsonProperty("title") String title, + @JsonProperty("publishYear") Year publishYear, + @JsonProperty("pageCount") int pageCount) { + + this.author = author; + this.title = title; + this.publishYear = publishYear; + this.pageCount = pageCount; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (!(o instanceof Book book)) { + return false; + } + + return pageCount == book.pageCount + && author.equals(book.author) + && title.equals(book.title) + && publishYear.equals(book.publishYear); + } + + @Override + public int hashCode() { + return Objects.hash(author, title, publishYear, pageCount); + } + + @Override + public String toString() { + return "Book{" + + "author='" + + author + + '\'' + + ", title='" + + title + + '\'' + + ", publishYear=" + + publishYear + + ", pageCount=" + + pageCount + + '}'; + } + + public int getPageCount() { + return pageCount; + } + + public Year getPublishYear() { + return publishYear; + } + + private final String author; + private final String title; + private final Year publishYear; + private final int pageCount; +} diff --git a/hw-02/student-reader/src/main/java/com/example/Student.java b/hw-02/student-reader/src/main/java/com/example/Student.java new file mode 100644 index 0000000..5b5dd53 --- /dev/null +++ b/hw-02/student-reader/src/main/java/com/example/Student.java @@ -0,0 +1,47 @@ +package com.example; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; + +public class Student { + + @JsonCreator + public Student( + @JsonProperty("name") String name, + @JsonProperty("surname") String surname, + @JsonProperty("books") List books) { + + this.name = name; + this.surname = surname; + this.books = List.copyOf(books); + } + + @Override + public String toString() { + StringBuilder booksString = new StringBuilder(); + + for (Book book : books) { + booksString.append("\n ").append(book); + } + + return "Student{\n" + + " name='" + + name + + "'\n" + + " surname='" + + surname + + "'\n" + + " books=" + + booksString + + "\n}"; + } + + public List getBooks() { + return books; + } + + private final String name; + private final String surname; + private final List books; +} diff --git a/hw-02/student-reader/src/main/java/com/example/StudentReader.java b/hw-02/student-reader/src/main/java/com/example/StudentReader.java new file mode 100644 index 0000000..fa6c29d --- /dev/null +++ b/hw-02/student-reader/src/main/java/com/example/StudentReader.java @@ -0,0 +1,20 @@ +package com.example; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import java.io.IOException; +import java.nio.file.Path; +import java.util.List; + +public final class StudentReader { + + public static List read(Path path) throws IOException { + return MAPPER.readValue(path.toFile(), new TypeReference>() {}); + } + + private StudentReader() {} + + private static final ObjectMapper MAPPER = + new ObjectMapper().registerModule(new JavaTimeModule()); +} diff --git a/hw-02/student-reader/students.json b/hw-02/student-reader/students.json new file mode 100644 index 0000000..ab7d6f3 --- /dev/null +++ b/hw-02/student-reader/students.json @@ -0,0 +1,110 @@ +[ + { + "name": "Aaa", + "surname": "Bbb", + "books": [ + { + "author": "Aaa Aaa", + "title": "Book Aaa", + "publishYear": "2027", + "pageCount": 500 + }, + { + "author": "Bbb Bbb", + "title": "Book Bbb", + "publishYear": "2018", + "pageCount": 200 + }, + { + "author": "Ccc Ccc", + "title": "Book Ccc", + "publishYear": "2024", + "pageCount": 900 + }, + { + "author": "Ddd Ddd", + "title": "Book Ddd", + "publishYear": "2015", + "pageCount": 400 + }, + { + "author": "Ddd Ddd", + "title": "Book Ddd", + "publishYear": "2015", + "pageCount": 400 + } + ] + }, + { + "name": "Ccc", + "surname": "Ddd", + "books": [ + { + "author": "Eee Eee", + "title": "Book Eee", + "publishYear": "1999", + "pageCount": 300 + }, + { + "author": "Fff Fff", + "title": "Book Fff", + "publishYear": "2030", + "pageCount": 1200 + }, + { + "author": "Ggg Ggg", + "title": "Book Ggg", + "publishYear": "2005", + "pageCount": 100 + }, + { + "author": "Hhh Hhh", + "title": "Book Hhh", + "publishYear": "2021", + "pageCount": 800 + }, + { + "author": "Iii Iii", + "title": "Book Iii", + "publishYear": "2012", + "pageCount": 600 + } + ] + }, + { + "name": "Eee", + "surname": "Fff", + "books": [ + { + "author": "Aaa Aaa", + "title": "Book Aaa", + "publishYear": "2027", + "pageCount": 500 + }, + { + "author": "Bbb Bbb", + "title": "Book Bbb", + "publishYear": "2018", + "pageCount": 200 + }, + { + "author": "Jjj Jjj", + "title": "Book Jjj", + "publishYear": "2001", + "pageCount": 1000 + }, + { + "author": "Kkk Kkk", + "title": "Book Kkk", + "publishYear": "1995", + "pageCount": 700 + }, + { + "author": "Lll Lll", + "title": "Book Lll", + "publishYear": "2025", + "pageCount": 1100 + } + ] + } +]