feat(hw-02): implement student and book stream processing
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
# Homework 02
|
||||
|
||||
1. Создать класс Student, обязательное поле класса Student - List<Book> (минимум по 5 книг у каждого)
|
||||
|
||||
2. Создать текстовый файл со студентами и книгами
|
||||
|
||||
3. При помощи внутренних фреймворков и библиотек для ввода-вывода информации в Java считать содержимое файла и заполнить List<Student> этими данными (Должен быть реализован механизм заполнения коллекции студентов из текстового файла)
|
||||
|
||||
4. При помощи одного (не допускается объявления никаких промежуточных переменных, совсем никаких) стрима:
|
||||
|
||||
Вывести в консоль каждого студента (переопределите toString)
|
||||
|
||||
Получить для каждого студента список книг
|
||||
|
||||
Получить книги
|
||||
|
||||
Отсортировать книги по количеству страниц (Не забывайте про условия для сравнения объектов)
|
||||
|
||||
Оставить только уникальные книги
|
||||
|
||||
Отфильтровать книги, оставив только те, которые были выпущены после 2000 года
|
||||
|
||||
Ограничить стрим на 3 элементах
|
||||
|
||||
Получить из книг годы выпуска
|
||||
|
||||
При помощи методов короткого замыкания (почитайте самостоятельно что это такое) вернуть Optional от года
|
||||
|
||||
При помощи методов получения значения из Optional вывести в консоль год выпуска найденной книги, либо запись о том, что такая книга отсутствует
|
||||
@@ -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());
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
Reference in New Issue
Block a user