База данных на java
Дана таблица:
Имя|Возраст|Должность|Зарплата
Кирилл|26|Middle java dev|150000 руб
Виталий|28|Senior java automation QA|2000$
Александр|31|junior functional tester|50000 руб
Дементий|35|dev-ops|1500$
Данная таблица представлена в формате List<Map<String,String>>, где каждый элемент list - строка, key в map - название столбца, value в map - значение ячейки
Задача:
- вывести имена всех сотрудников, младше 30.
- вывести имена всех сотрудников, получающих зарплату в рублях.
- вывести средний возраст всех сотрудников.
Наткнулся на такую задачу, как с помощью sql это сделать, я знаю. Вроде и коллекции с обобщениями понимаю, но что делать тут меня повергло в тупик. Может кто подкинуть материал(где разбирают подобное) или помочь с этой задачкой
Ответы (1 шт):
Для начала создаёте класс-сущность для представления данных в таблице, который может принимать на вход Map<String, String>:
public class Person {
private String name;
private int age;
private String position;
private int salary;
private String ccy;
public Person(Map<String, String> map) {
this.name = map.get("Имя");
this.age = Integer.parseInt(map.get("Возраст"));
this.position = map.get("Должность");
this.salary = Integer.parseInt(map.get("Зарплата").split("\\D+")[0]);
this.ccy = map.get("Зарплата").split("[\\d\\s]+")[1];
}
// геттеры/сеттеры/toString
}
Затем используете Stream API map + collect для преобразования списка мап в список конкретных объектов:
List<Map<String, String>> data = ...; // сырые табличные данные
List<Person> persons = data.stream()
.map(Person::new)
.collect(Collectors.toList()); // или toList() для Java 16+
И обрабатываете полученный список для поиска нужной информации, также с использованием Stream API (filter, mapToInt + IntStream::average, и т.п.):
// вывести имена всех сотрудников, младше 30.
persons.stream()
.filter(p -> p.getAge() < 30)
.map(Person::getName)
.forEach(System.out::println);
// вывести имена всех сотрудников, получающих зарплату в рублях.
persons.stream()
.filter(p -> "руб".equals(p.getCcy()))
.map(Person::getName)
.forEach(System.out::println);
// вывести средний возраст всех сотрудников.
double avgAge = persons.stream()
.mapToInt(Person::getAge) // IntStream
.average() // OptionalDouble
.getAsDouble(); // double
System.out.println(avgAge);
"Сырые" данные могут быть представлены следующим образом, используя фабричные методы Map.of / List.of:
List<Map<String, String>> data = List.of(
Map.of(
"Имя", "Кирилл", "Возраст", "26",
"Должность", "Middle java dev", "Зарплата", "150000 руб"
),
Map.of(
"Имя", "Виталий", "Возраст", "28",
"Должность", "Senior java automation QA", "Зарплата", "2000$"
)
// ... и т.д.
);