Ste*_*ier 2 java java-8 java-stream
假设我有一份月度商店销售清单,以便:
ID, date, amount
1, Jan 2016, $500
2, Feb 2017, $200
3, October 2017, $300
Run Code Online (Sandbox Code Playgroud)
我的财政年度是2016年9月1日到2017年8月31日.换句话说,前两个条目是在一个会计年度,另一个是在第二个会计年度.实际会计年度是特定于用户的.
我想storeSales为每个会计年度创建一个列表.
到目前为止,我有:
Map<fiscalYearID, List<StoreSale> = storeSales.stream()
.collect(
Collectors.groupingBy(
storeSale -> storeSale.getSaleLocalDate()));
Run Code Online (Sandbox Code Playgroud)
问题是上面的代码只会按确切日期分组.我可以添加,.getYear()但只能按年份而不是财政年度.我还考虑过使用Stream.iterate()每个会计年度日期范围,然后浏览该日期范围内所有商店的商店销售列表到列表中,但这会非常难看,大O值开始迅速攀升.这将是这样的:
Stream.iterate(startDate, date -> date.plusMonths(1))
.limit(ChronoUnit.MONTHS.between(startDate, endDate.plusMonths(1)))
.forEach(
{
addToFiscalYear(fiscalYearID,
storeSales.stream().
.filter(storeSale -> storeSale.getSaleLocalDate().equals(date))
.collect(Collectors.toList());
});
Run Code Online (Sandbox Code Playgroud)
或类似的东西.我没有太多探索它,因为它的大O快速增加,我希望有更好的解决方案......
您需要一个接受日期并返回fiscalYearID的方法:
public static fiscalYearID getFiscalYearID (Date date)
{
// return fiscal year ID matching passed date
}
Run Code Online (Sandbox Code Playgroud)
现在你可以分组fiscalYearID(假设fiscalYearID是一个覆盖的类equals):
Map<fiscalYearID, List<StoreSale>> =
storeSales.stream()
.collect(Collectors.groupingBy(s -> getFiscalYearID (s.getSaleLocalDate())));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
121 次 |
| 最近记录: |