feat(hw-02): implement student and book stream processing

This commit is contained in:
user
2026-08-07 14:57:43 +04:00
parent 3a26e58ae2
commit 21c1190aa7
7 changed files with 388 additions and 0 deletions
+29
View File
@@ -0,0 +1,29 @@
# Homework 02
1. Создать класс Student, обязательное поле класса Student - List<Book> (минимум по 5 книг у каждого)
2. Создать текстовый файл со студентами и книгами
3. При помощи внутренних фреймворков и библиотек для ввода-вывода информации в Java считать содержимое файла и заполнить List<Student> этими данными (Должен быть реализован механизм заполнения коллекции студентов из текстового файла)
4. При помощи одного (не допускается объявления никаких промежуточных переменных, совсем никаких) стрима:
Вывести в консоль каждого студента (переопределите toString)
Получить для каждого студента список книг
Получить книги
Отсортировать книги по количеству страниц (Не забывайте про условия для сравнения объектов)
Оставить только уникальные книги
Отфильтровать книги, оставив только те, которые были выпущены после 2000 года
Ограничить стрим на 3 элементах
Получить из книг годы выпуска
При помощи методов короткого замыкания (почитайте самостоятельно что это такое) вернуть Optional от года
При помощи методов получения значения из Optional вывести в консоль год выпуска найденной книги, либо запись о том, что такая книга отсутствует
+39
View File
@@ -0,0 +1,39 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>student-reader</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>student-reader</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.20.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.20.0</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
</properties>
</project>
@@ -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<Student> students = StudentReader.read(studentsJsonFile);
// Условие использования одного stream сохраняется
students.stream()
// Вывести в консоль каждого студента (переопределите toString)
.peek(System.out::println)
// Получить для каждого студента список книг
.map(s -> s.getBooks()) // Stream<List<Book>>
// Получить книги
.flatMap(List::stream) // Stream<Book>;
// 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("Выполнение программы завершено");
}
}
@@ -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;
}
@@ -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<Book> 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<Book> getBooks() {
return books;
}
private final String name;
private final String surname;
private final List<Book> books;
}
@@ -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<Student> read(Path path) throws IOException {
return MAPPER.readValue(path.toFile(), new TypeReference<List<Student>>() {});
}
private StudentReader() {}
private static final ObjectMapper MAPPER =
new ObjectMapper().registerModule(new JavaTimeModule());
}
+110
View File
@@ -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
}
]
}
]