Как агрегировать по определенному значению и создавать вложенную карту по списку объектов? - PullRequest
1 голос
/ 26 мая 2020

У меня есть List<SingleDay>, где SingleDay это:

class SingleDay{ 
      private Date date;
      private String County;

   // otherstuff
}

Я хотел бы преобразовать это в Map<LocalDate, Map<String,SingleDay>> с помощью следующего преобразования:

Key: 2020-05-27, Value: {'County1'=SingleDay [date=2020-05-27, County='County1'],
                         'County2'=SingleDay [date=2020-05-27, County='County2'], 
                         'County3'=SingleDay [date=2020-05-27, County='County3']
                        }
Key: 2020-05-28, Value: {'County4'=SingleDay [date=2020-05-28, County='County4'],
                         'County5'=SingleDay [date=2020-05-28, County='County5'], 
                         'County3'=SingleDay [date=2020-05-28, County='County3']
                        }

Примечание , это вопрос, возникший из моего предыдущего вопроса: Как использовать java stream api для преобразования списка объектов во вложенную карту на основе информации, хранящейся внутри объекта?

1 Ответ

2 голосов
/ 26 мая 2020

Сделайте это следующим образом:

Map<LocalDate, Map<String, SingleDay>> result = list.stream()
            .collect(Collectors.groupingBy(SingleDay::getDate, Collectors.toMap(SingleDay::getCounty, e -> e)));

Демо:

import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

class SingleDay {
    private LocalDate date;
    private String County;

    public SingleDay(LocalDate date, String county) {
        this.date = date;
        County = county;
    }
    public LocalDate getDate() {
        return date;
    }

    public String getCounty() {
        return County;
    }

    @Override
    public String toString() {
        return "SingleDay [date=" + date + ", County=" + County + "]";
    }
    // otherstuff
}

public class Main {
    public static void main(String[] args) {
        List<SingleDay> list = List.of(
                new SingleDay(LocalDate.now(), "X"), 
                new SingleDay(LocalDate.now(), "Y"),
                new SingleDay(LocalDate.now(), "Z"), 
                new SingleDay(LocalDate.now().plusDays(1), "A"),
                new SingleDay(LocalDate.now().plusDays(1), "B"), 
                new SingleDay(LocalDate.now().plusDays(1), "C"));

        Map<LocalDate, Map<String, SingleDay>> result = list.stream()
                .collect(Collectors.groupingBy(SingleDay::getDate, Collectors.toMap(SingleDay::getCounty, e -> e)));

        // Display
        result.forEach((k, v) -> System.out.println("Key: " + k + ", Value: " + v));
    }
}

Вывод:

Key: 2020-05-27, Value: {A=SingleDay [date=2020-05-27, County=A], B=SingleDay [date=2020-05-27, County=B], C=SingleDay [date=2020-05-27, County=C]}
Key: 2020-05-26, Value: {X=SingleDay [date=2020-05-26, County=X], Y=SingleDay [date=2020-05-26, County=Y], Z=SingleDay [date=2020-05-26, County=Z]}
...