diff --git a/src/com/walking/lesson49_optional/task1/Main.java b/src/com/walking/lesson49_optional/task1/Main.java index d4a54f35c..e440ddba6 100644 --- a/src/com/walking/lesson49_optional/task1/Main.java +++ b/src/com/walking/lesson49_optional/task1/Main.java @@ -1,5 +1,11 @@ package com.walking.lesson49_optional.task1; +import com.walking.lesson49_optional.task1.model.Car; +import com.walking.lesson49_optional.task1.service.CarService; + +import java.util.Optional; +import java.util.Scanner; + /** * Реализуйте задачу 2 урока 43: * ... @@ -8,5 +14,49 @@ */ public class Main { public static void main(String[] args) { + CarService carService = new CarService(initCars()); + + Car desiredCar = createCar(); + Optional foundCar = carService.findCar(desiredCar); + + String found = foundCar.map("Найдена машина:\n%s"::formatted) + .orElse("Подходящая машина не обнаружена"); + + System.out.println(found); + } + + private static Car createCar() { + Scanner scanner = new Scanner(System.in); + + System.out.println("Enter a car's number"); + String number = scanner.nextLine(); + + System.out.println("Enter a car's color"); + String color = scanner.nextLine(); + + System.out.println("Enter a car's year"); + int year = scanner.nextInt(); + + System.out.println("Enter a actuality of technical inspection"); + boolean actualTechnicalInspection = scanner.nextBoolean(); + + scanner.close(); + + return new Car(number, year, color, actualTechnicalInspection); + } + + private static Car[] initCars() { + Car car1 = new Car("RR-111-RR", 2015, "yellow", true); + Car car2 = new Car("RR-222-RR", 2016, "yellow", true); + Car car3 = new Car("RR-333-RR", 2017, "yellow", true); + Car car4 = new Car("RR-444-RR", 2018, "yellow", true); + Car car5 = new Car("RR-555-RR", 2018, "yellow", true); + Car car6 = new Car("RR-777-RR", 2015, "yellow", true); + Car car7 = new Car("RR-777-RR", 2018, "yellow", true); + Car car8 = new Car("RR-888-RR", 2018, "yellow", true); + Car car9 = new Car("RR-999-RR", 2018, "yellow", true); + Car car10 = new Car("RR-000-RR", 2018, "yellow", true); + + return new Car[]{car1, car2, car3, car4, car5, car6, car7, car8, car9, car10}; } } diff --git a/src/com/walking/lesson49_optional/task1/model/Car.java b/src/com/walking/lesson49_optional/task1/model/Car.java new file mode 100644 index 000000000..354a1339c --- /dev/null +++ b/src/com/walking/lesson49_optional/task1/model/Car.java @@ -0,0 +1,45 @@ +package com.walking.lesson49_optional.task1.model; + + +public class Car { + private final CarIdentifier identifier; + + private String color; + private boolean actualTechnicalInspection; + + public Car(String number, int year, String color, boolean actualTechnicalInspection) { + this(new CarIdentifier(number, year), color, actualTechnicalInspection); + } + + public Car(CarIdentifier identifier, String color, boolean actualTechnicalInspection) { + this.identifier = identifier; + this.color = color; + this.actualTechnicalInspection = actualTechnicalInspection; + } + + public CarIdentifier getIdentifier() { + return identifier; + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } + + public boolean isActualTechnicalInspection() { + return actualTechnicalInspection; + } + + public void setActualTechnicalInspection(boolean actualTechnicalInspection) { + this.actualTechnicalInspection = actualTechnicalInspection; + } + + @Override + public String toString() { + return "number: %s | year: %d | color: %s | actualTechnicalInspection: %s".formatted(identifier.getNumber(), + identifier.getYear(), color, actualTechnicalInspection ? "actual" : "not actual"); + } +} \ No newline at end of file diff --git a/src/com/walking/lesson49_optional/task1/model/CarIdentifier.java b/src/com/walking/lesson49_optional/task1/model/CarIdentifier.java new file mode 100644 index 000000000..6007061c7 --- /dev/null +++ b/src/com/walking/lesson49_optional/task1/model/CarIdentifier.java @@ -0,0 +1,44 @@ +package com.walking.lesson49_optional.task1.model; + +import java.util.Objects; + +public class CarIdentifier { + private final String number; + private final int year; + + public CarIdentifier(String number, int year) { + this.number = number; + this.year = year; + } + + public String getNumber() { + return number; + } + + public int getYear() { + return year; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (o == null || !getClass().equals(o.getClass())) { + return false; + } + + CarIdentifier identifier = (CarIdentifier) o; + + return year == identifier.year && Objects.equals(number, identifier.number); + } + + @Override + public int hashCode() { + int hashcode = number.hashCode(); + hashcode += 31 * year; + + return hashcode; + } +} \ No newline at end of file diff --git a/src/com/walking/lesson49_optional/task1/service/CarService.java b/src/com/walking/lesson49_optional/task1/service/CarService.java new file mode 100644 index 000000000..41d09d31f --- /dev/null +++ b/src/com/walking/lesson49_optional/task1/service/CarService.java @@ -0,0 +1,24 @@ +package com.walking.lesson49_optional.task1.service; + +import com.walking.lesson49_optional.task1.model.Car; +import com.walking.lesson49_optional.task1.model.CarIdentifier; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +public class CarService { + private final Map cars = new HashMap<>(); + + public CarService(Car[] cars) { + for (Car car : cars) { + this.cars.put(car.getIdentifier(), car); + } + } + + public Optional findCar(Car car) { + return Optional.ofNullable(car) + .map(Car::getIdentifier) + .map(cars::get); + } +} diff --git a/src/com/walking/lesson49_optional/task2/Main.java b/src/com/walking/lesson49_optional/task2/Main.java index 092a44e0d..bfa4a5230 100644 --- a/src/com/walking/lesson49_optional/task2/Main.java +++ b/src/com/walking/lesson49_optional/task2/Main.java @@ -1,5 +1,15 @@ package com.walking.lesson49_optional.task2; +import com.walking.lesson49_optional.task2.model.Car; +import com.walking.lesson49_optional.task2.model.CarIdentifier; +import com.walking.lesson49_optional.task2.model.Home; +import com.walking.lesson49_optional.task2.model.Person; +import com.walking.lesson49_optional.task2.service.CarService; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + /** * Реализуйте рад классов: * 1. Жилье, должен иметь поле «адрес»; @@ -17,5 +27,33 @@ */ public class Main { public static void main(String[] args) { + Home testHome = new Home("ADDRESS"); + Car testCar = new Car(new CarIdentifier("NUMBER", 2000), null, "red", true); + Person testCarOwner = new Person("OWNER", null, null, new ArrayList<>(), testHome, testCar, "fireman"); + testCar.setOwner(testCarOwner); + Person testCarOwnerChild = new Person("CHILD", null, testCarOwner, null, testHome, null, "fireman"); + testCarOwner.addChild(testCarOwnerChild); + + CarService carService = new CarService(new Car[]{testCar}); + + Optional foundAddress = carService.findCar(testCar) + .filter(car -> car.getIdentifier() + .getYear() <= 2021) + .map(Car::getOwner) + .filter(person -> !person.getProfession() + .equals("policeman")) + .map(Person::getChildren) + .filter(list -> !list.isEmpty()) + .map(List::getFirst) + .filter(person -> !person.getProfession() + .equals("policeman")) + .map(Person::getHome) + .map(Home::getAddress) + .filter(address -> !address.contains("Рублевское шоссе")); + + String address = foundAddress.map("Найден адрес:\n%s"::formatted) + .orElse("Адресс не найден"); + + System.out.println(address); } } diff --git a/src/com/walking/lesson49_optional/task2/model/Car.java b/src/com/walking/lesson49_optional/task2/model/Car.java new file mode 100644 index 000000000..cd5a151c8 --- /dev/null +++ b/src/com/walking/lesson49_optional/task2/model/Car.java @@ -0,0 +1,55 @@ +package com.walking.lesson49_optional.task2.model; + + +public class Car { + private final CarIdentifier identifier; + + private Person owner; + private String color; + private boolean actualTechnicalInspection; + + public Car(String number, int year, Person owner, String color, boolean actualTechnicalInspection) { + this(new CarIdentifier(number, year), owner, color, actualTechnicalInspection); + } + + public Car(CarIdentifier identifier, Person owner, String color, boolean actualTechnicalInspection) { + this.identifier = identifier; + this.owner = owner; + this.color = color; + this.actualTechnicalInspection = actualTechnicalInspection; + } + + public CarIdentifier getIdentifier() { + return identifier; + } + + public Person getOwner() { + return owner; + } + + public void setOwner(Person owner) { + this.owner = owner; + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } + + public boolean isActualTechnicalInspection() { + return actualTechnicalInspection; + } + + public void setActualTechnicalInspection(boolean actualTechnicalInspection) { + this.actualTechnicalInspection = actualTechnicalInspection; + } + + @Override + public String toString() { + return "number: %s | year: %d | owner: %s | color: %s | actualTechnicalInspection: %s".formatted(identifier.getNumber(), + identifier.getYear(), owner.getName(), color, actualTechnicalInspection ? "actual" : "not actual"); + } +} \ No newline at end of file diff --git a/src/com/walking/lesson49_optional/task2/model/CarIdentifier.java b/src/com/walking/lesson49_optional/task2/model/CarIdentifier.java new file mode 100644 index 000000000..3705af321 --- /dev/null +++ b/src/com/walking/lesson49_optional/task2/model/CarIdentifier.java @@ -0,0 +1,44 @@ +package com.walking.lesson49_optional.task2.model; + +import java.util.Objects; + +public class CarIdentifier { + private final String number; + private final int year; + + public CarIdentifier(String number, int year) { + this.number = number; + this.year = year; + } + + public String getNumber() { + return number; + } + + public int getYear() { + return year; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (o == null || !getClass().equals(o.getClass())) { + return false; + } + + CarIdentifier identifier = (CarIdentifier) o; + + return year == identifier.year && Objects.equals(number, identifier.number); + } + + @Override + public int hashCode() { + int hashcode = number.hashCode(); + hashcode += 31 * year; + + return hashcode; + } +} \ No newline at end of file diff --git a/src/com/walking/lesson49_optional/task2/model/Home.java b/src/com/walking/lesson49_optional/task2/model/Home.java new file mode 100644 index 000000000..96d45f068 --- /dev/null +++ b/src/com/walking/lesson49_optional/task2/model/Home.java @@ -0,0 +1,13 @@ +package com.walking.lesson49_optional.task2.model; + +public class Home { + private final String address; + + public Home(String address) { + this.address = address; + } + + public String getAddress() { + return address; + } +} diff --git a/src/com/walking/lesson49_optional/task2/model/Person.java b/src/com/walking/lesson49_optional/task2/model/Person.java new file mode 100644 index 000000000..c07373e34 --- /dev/null +++ b/src/com/walking/lesson49_optional/task2/model/Person.java @@ -0,0 +1,57 @@ +package com.walking.lesson49_optional.task2.model; + +import java.util.ArrayList; +import java.util.List; + +public class Person { + private final String name; + private final Person mother; + private final Person father; + private List children = new ArrayList<>(); + private final Home home; + private final Car car; + private final String profession; + + public Person(String name, Person mother, Person father, List children, Home home, Car car, + String profession) { + this.name = name; + this.mother = mother; + this.father = father; + this.children = children; + this.home = home; + this.car = car; + this.profession = profession; + } + + public String getName() { + return name; + } + + public Person getMother() { + return mother; + } + + public Person getFather() { + return father; + } + + public List getChildren() { + return children; + } + + public void addChild(Person child) { + children.add(child); + } + + public Home getHome() { + return home; + } + + public Car getCar() { + return car; + } + + public String getProfession() { + return profession; + } +} diff --git a/src/com/walking/lesson49_optional/task2/service/CarService.java b/src/com/walking/lesson49_optional/task2/service/CarService.java new file mode 100644 index 000000000..bb33e6379 --- /dev/null +++ b/src/com/walking/lesson49_optional/task2/service/CarService.java @@ -0,0 +1,24 @@ +package com.walking.lesson49_optional.task2.service; + +import com.walking.lesson49_optional.task2.model.Car; +import com.walking.lesson49_optional.task2.model.CarIdentifier; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +public class CarService { + private final Map cars = new HashMap<>(); + + public CarService(Car[] cars) { + for (Car car : cars) { + this.cars.put(car.getIdentifier(), car); + } + } + + public Optional findCar(Car car) { + return Optional.ofNullable(car) + .map(Car::getIdentifier) + .map(cars::get); + } +} diff --git a/src/com/walking/lesson49_optional/task3/Main.java b/src/com/walking/lesson49_optional/task3/Main.java index ccda944bc..4acc4cb90 100644 --- a/src/com/walking/lesson49_optional/task3/Main.java +++ b/src/com/walking/lesson49_optional/task3/Main.java @@ -1,5 +1,14 @@ package com.walking.lesson49_optional.task3; +import com.walking.lesson49_optional.task3.model.Animal; +import com.walking.lesson49_optional.task3.model.Cat; +import com.walking.lesson49_optional.task3.model.Cow; +import com.walking.lesson49_optional.task3.model.Dog; + +import java.util.Optional; + +import static java.util.AbstractMap.*; + /** * Реализуйте абстрактный класс «Животное», содержащий абстрактный метод sound(). * Также реализуйте трех наследников: кота, собаку и корову. @@ -14,5 +23,32 @@ */ public class Main { public static void main(String[] args) { + Animal[] animals = new Animal[]{new Cat(), new Dog(), new Cow(), null}; + + for (Animal animal : animals) { + printAnimal(animal); + + } + } + + private static void printAnimal(Animal animal) { + Optional.ofNullable(animal) + .filter(x -> x instanceof Cat) + .map(x -> new SimpleEntry<>("Cat", x.sound())) + .or(() -> Optional.ofNullable(animal) + .filter(x -> x instanceof Dog) + .map(x -> new SimpleEntry<>("Dog", x.sound()))) + .or(() -> Optional.ofNullable(animal) + .filter(x -> x instanceof Cow) + .map(x -> new SimpleEntry<>("Cow", x.sound()))) + .map(x -> "Это %s, он (она) говорит %s".formatted(x.getKey(), x.getValue())) + .ifPresentOrElse(System.out::println, () -> System.out.println("Это неизвестное животное")); + } + + private static void printAnimal1(Animal animal) { + Optional.ofNullable(animal) + .map(x -> "Это %s, он (она) говорит %s".formatted(x.getClass() + .getSimpleName(), x.sound())) + .ifPresentOrElse(System.out::println, () -> System.out.println("Это неизвестное животное")); } } diff --git a/src/com/walking/lesson49_optional/task3/model/Animal.java b/src/com/walking/lesson49_optional/task3/model/Animal.java new file mode 100644 index 000000000..594c5438b --- /dev/null +++ b/src/com/walking/lesson49_optional/task3/model/Animal.java @@ -0,0 +1,5 @@ +package com.walking.lesson49_optional.task3.model; + +public abstract class Animal { + public abstract String sound(); +} diff --git a/src/com/walking/lesson49_optional/task3/model/Cat.java b/src/com/walking/lesson49_optional/task3/model/Cat.java new file mode 100644 index 000000000..cb3fd0677 --- /dev/null +++ b/src/com/walking/lesson49_optional/task3/model/Cat.java @@ -0,0 +1,8 @@ +package com.walking.lesson49_optional.task3.model; + +public class Cat extends Animal { + @Override + public String sound() { + return "mau"; + } +} diff --git a/src/com/walking/lesson49_optional/task3/model/Cow.java b/src/com/walking/lesson49_optional/task3/model/Cow.java new file mode 100644 index 000000000..5b2f2f77e --- /dev/null +++ b/src/com/walking/lesson49_optional/task3/model/Cow.java @@ -0,0 +1,8 @@ +package com.walking.lesson49_optional.task3.model; + +public class Cow extends Animal { + @Override + public String sound() { + return "muuu"; + } +} diff --git a/src/com/walking/lesson49_optional/task3/model/Dog.java b/src/com/walking/lesson49_optional/task3/model/Dog.java new file mode 100644 index 000000000..fcf628928 --- /dev/null +++ b/src/com/walking/lesson49_optional/task3/model/Dog.java @@ -0,0 +1,8 @@ +package com.walking.lesson49_optional.task3.model; + +public class Dog extends Animal { + @Override + public String sound() { + return "voof"; + } +}