Как вы используете java stream api для преобразования списка объектов во вложенную карту на основе информации, хранящейся внутри объекта? - PullRequest
3 голосов
/ 25 мая 2020

У меня есть список объектов List<SingleDay>, где SingleDay -

class SingleDay{ 
      private Date date;
      private String County;

   // otherstuff
}

Я хочу преобразовать этот список в Map<Date, Map<String, SingleDay>>. То есть мне нужна карта от даты до карты графств с исходным объектом.

Например:
02/12/2020 : { "Rockbridge": {SingleDayObject}}

Мне не удалось заставить что-либо работать, и все, что я нашел в Интернете, если из списка объектов на карту, а не из списка объекты на вложенную карту.

По сути, я хочу иметь возможность быстро запрашивать объект, соответствующий дате и округу.

Спасибо!

Ответы [ 2 ]

5 голосов
/ 25 мая 2020

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

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

Демо:

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().plusDays(1), "Y"), new SingleDay(LocalDate.now().plusDays(2), "Z"));

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

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

Вывод:

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

Примечание: Я использовал LocalDate вместо устаревшего java.util.Date. Я настоятельно рекомендую вам использовать java .time API вместо сломанного java.util.Date. Отметьте это , чтобы узнать об этом подробнее.

0 голосов
/ 25 мая 2020

Немного более читаемая структура данных могла бы составить Map<SingleDay, SingleDay>. Может показаться излишним, но это позволит вам легко найти ваши объекты.

Map<SingleDay, SingleDay> myMap = new HashMap();
list.forEach(day -> myMap.put(day, day));

Затем, чтобы получить один, вы можете просто

SingleDay day = mMap.get(myDay);

Очень важно не забыть переопределить equals() метод SingleDay, основанный на том, что вы считаете равным.

...