Сопоставить элементы потока с LocalDate без сбора в список - PullRequest
0 голосов
/ 17 марта 2020

Предположим, у меня есть поток целых чисел, представляющих ежедневные данные:

Stream.of(12,19,7,13,42,69);

, где каждое число принадлежит одной дате, начиная с 22.01.2020, и я хочу получить карту Map<LocalDate,Integer>.

По сути, мне нужно что-то вроде:

22.01.2020  = 12
23.01.2020  = 19
24.01.2020  = 7
25.01.2020  = 13
26.01.2020  = 42
27.01.2020  = 69

Как увеличить ключ (LocalDate), начиная с определенной даты (например, 22.01.2020)?

Map<LocalDate,Integer> map = Stream.of(12,19,7,13,42,69)
              .collect(Collectors.toMap(x -> **LocalDate.of(2020,1,22)**, x -> x));

Ответы [ 2 ]

2 голосов
/ 17 марта 2020

Более чистым решением может быть использование IntStream, например:

LocalDate firstDay = LocalDate.of(2020, Month.JANUARY, 22);
List<Integer> data = List.of(12, 19, 7, 13, 42, 69);
Map<LocalDate, Integer> finalMap = IntStream.range(0, data.size())
        .mapToObj(day -> Map.entry(firstDay.plusDays(day), data.get(day)))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

Или, если вы застряли с Stream<Integer> в качестве ввода данных с использованием AtomicInteger, это не будет плохой идеей, если ограничение на выполнение последовательного выполнения:

LocalDate firstDay = LocalDate.of(2020, Month.JANUARY, 22);
AtomicInteger dayCount = new AtomicInteger();
Map<LocalDate, Integer> finalMap = Stream.of(12, 19, 7, 13, 42, 69)
        .map(data -> Map.entry(firstDay.plusDays(dayCount.getAndIncrement()), data))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
System.out.println(finalMap);
1 голос
/ 17 марта 2020

Это немного сложно достичь, в основном потому, что вы работаете как с Stream<LocalDate>, так и с Stream<Integer>. Один хак должен сохранить начальную дату в одноэлементном массиве и изменить ее внутри Collector:

LocalDate[] startDate = { LocalDate.of(2020, Month.JANUARY, 21) };

Map<LocalDate, Integer> map = Stream.of(12, 19, 7, 13, 42, 69)
    .collect(Collectors.toMap(x -> {
        startDate[0] = startDate[0].plusDays(1L);
        return startDate[0];
    }, Function.identity()));

System.out.println(map);

. Вывод:

{2020-01-27=69, 2020-01-26=42, 2020-01-25=13, 2020-01-24=7, 2020-01-23=19, 2020-01-22=12}

Более чистым решением было бы создание пользовательского Collector, чтобы вы могли поддерживать сбор параллели Stream.

...