База данных на java

Рейтинг: 0Ответов: 1Опубликовано: 16.02.2023

Дана таблица:

Имя|Возраст|Должность|Зарплата
Кирилл|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$"
    )
// ... и т.д.
);