Потоки Java Map to Dto в Map<String,List> по определенному атрибуту в Java 8

Я хочу получить список после использования потока, а затем сопоставить объект человека с его dto.

Я сохранил «ЗНАЧЕНИЕ» как перечисление, например ЗНАЧЕНИЕ1, ЗНАЧЕНИЕ2, ЗНАЧЕНИЕ3. Вот мои значения в Map<String (id), List<Person>>

Id, Tag, Value, Date , Message
p1, VALUE1, 10, 10-10-2000 , "Message"
p2, VALUE1, 20, 10-10-2000 , "Message"
p1, VALUE2, "Text", 10-10-2000 , "Message"
p2, VALUE2, "Text", 10-10-2000 , "Message"
p1, VALUE3, 11-11-2000, 10-10-2000 , "Message"
p2, VALUE3, 12-11-2000, 10-10-2000 , "Message"

То, что я хочу получить, показано ниже.

Tag, Id, Value, Date
VALUE1, p1, 10, "10-10-2000"
VALUE1, p2, 20, "10-10-2000"  
VALUE2, p1, "Text", "10-10-2000"  
VALUE2, p2, "Text", "10-10-2000"  
VALUE3, p1, 11-11-2000, "10-10-2000"  
VALUE3, p2, 12-11-2000, "10-10-2000"

Как видите, столбец Value имеет разные значения (String, Int, Date). Вот почему я определил ценность как объект. Я также храню дату как локальную дату.

Вот мой класс значений, показанный ниже.

public enum Value {
    VALUE1,VALUE2,VALUE3
}

Вот мой класс Dto, показанный ниже.

public class PersonDto {
    private Value value;
    private String id;
    private String date;
    private Object result;
}
 

Как я могу это сделать?

Вот мои фрагменты кода, показанные ниже. Однако я не могу продолжать

static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");

    List<PersonDto > result= persons.values().stream()
            .flatMap(List::stream).map(person->
                    String date = LocalDate.parse(person.getEventDate(), formatter) // Error
                    new PersonDto (person.getEvent(),person.getEmpID(),
                            ,person.getEvent())
            .collect(Collectors.toList());..

Итак, вы хотите те же данные, за исключением сообщения с переставленными местами первых двух столбцов?

g00se 19.11.2022 13:09

@ g00se g00se Я не могу сопоставить объект с dto, поскольку значение определяется как объект.

S.N 19.11.2022 13:12

@ g00se Я отредактировал свой пост после переопределения коллекции.

S.N 19.11.2022 13:20
persons.values().stream().flatMap(List::stream).map(p -> new PersonDto(...)).collect(Collectors.toList())
user17233545 19.11.2022 13:33

@英語は苦手 I revised my post. I followed your way but I cannot convert localdate to string.

S.N 19.11.2022 13:49

У вас не может быть двух полей с одинаковыми именами value — это не скомпилируется. Почему второе значение имеет тип Object? Какой смысл хранить дату в виде строки?

Alexander Ivanchenko 19.11.2022 13:56
String date = formatter.format(person.getEventDate())
user17233545 19.11.2022 13:57

@AlexanderIvanchenko Я исправил. Я поделился ответом.

S.N 19.11.2022 14:03
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Как включить TLS в gRPC-клиенте и сервере : 2
Как включить TLS в gRPC-клиенте и сервере : 2
Здравствуйте! 🙏🏻 Надеюсь, у вас все хорошо и добро пожаловать в мой блог.
Сортировка hashmap по значениям
Сортировка hashmap по значениям
На Leetcode я решал задачу с хэшмапой и подумал, что мне нужно отсортировать хэшмапу по значениям.
Принципы SOLID - лучшие практики
Принципы SOLID - лучшие практики
SOLID - это аббревиатура, обозначающая пять ключевых принципов проектирования: принцип единой ответственности, принцип "открыто-закрыто", принцип...
gRPC на Android с использованием TLS
gRPC на Android с использованием TLS
gRPC - это относительно новая концепция взаимодействия между клиентом и сервером, но не более.
0
8
94
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот ответ, показанный ниже

List<PersonDto> yearlyFinancialReportDtos = persons.values().stream()
                .flatMap(List::stream).map(person ->
                        new YearlyFinancialReportDto(person.getValue(),person .getId(),formatter.format(person .getDate())
                                ,person .getResult()))
                .collect(Collectors.toList());

Другие вопросы по теме

У меня есть List[(List[A], List[R])] - список кортежа из двух списков объектов A и R соответственно. Как «сгладить» список [R] для каждого списка [A]?
Список Kotlin removeAll не работает со списком
Мне нужно разобрать файл XML с помощью python, но я не могу импортировать какую-либо библиотеку, для которой требуется pip
TypeError: индексы списка должны быть целыми числами или срезами, а не str - работа с фреймами данных
Сгруппировать список объектов по ключу в список с подсписками уникальных объектов (с java-потоками)
Как получить случайное значение из словаря, который находится в списке
Как сравнить два разных списка объектов?
Как создать вложенный словарь из списка строк (Python)?
Разделение строки на основе нескольких разделителей с использованием функции split() в python, игнорируя определенные специальные символы, присутствующие в строке
Список кортежей Python: увеличьте количество членов кортежа