假设我有一个表示每日数据的整数流:
Stream.of(12,19,7,13,42,69);
其中每个数字都属于一个始于2020年1月22日的日期,我想获取一张地图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
如何从给定日期(例如,2020年1月22日)开始增加键(LocalDate)?
Map<LocalDate,Integer> map = Stream.of(12,19,7,13,42,69)
.collect(Collectors.toMap(x -> **LocalDate.of(2020,1,22)**, x -> x));
答案 0 :(得分:2)
更清洁的解决方案是使用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 :(得分:1)
要实现此目标有点困难,主要是因为您同时使用Stream<LocalDate>
和Stream<Integer>
。一种 hack 是将开始日期存储在单个元素数组中,并在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
。