Для начала создаёте класс-сущность для представления данных в таблице, который может принимать на вход 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$"
)
// ... и т.д.
);