我有一个发票的模型类,它包含购买日期和价格。
Class Invoice{
Date purchaseDate;
BigDecimal price;
//getters and setters
}
我得到了发票列表,其中包含一个月内售出的产品的所有发票:
List<Invoice> invoiceListForMonth;
我想在每个月的每一天完成总销售额。
List<BigDecimal> dayWiseSales;
如何在java 8中使用lambda函数获取列表中的数据?
发布于 2018-08-29 04:15:33
首先,您应该使用LocalDate
而不是Date
。
要获得每个产品的概述,您可以轻松地在相应的地图中转换您的List<Invoice> invoiceListForMonth
,如下所示:
final Map<LocalDate, BigDecimal> dateBigDecimalMap = listinvoiceListForMonth
.stream()
.sorted(Comparator.comparing(Invoice::getPurchaseDate))
.collect(Collectors.toMap(
Invoice::getPurchaseDate,
Invoice::getPrice,
BigDecimal::add));
然后,您可以在一条语句中创建List<BigDecimal> dayWiseSales
:
final List<BigDecimal> dayWiseSales = dateBigDecimalMap.values();
发布于 2018-08-29 03:58:47
首先,使用LocalDate而不是Date。那么它应该是这样的:
class Scratch {
public static void main(String[] args) {
List<Invoice> invoices = Arrays.asList(
new Invoice(LocalDate.now(), BigDecimal.ONE),
new Invoice(LocalDate.now().minusDays(1), BigDecimal.TEN),
new Invoice(LocalDate.now(), BigDecimal.TEN)
);
Month requiredMonth = LocalDate.now().getMonth();
Map<LocalDate, BigDecimal> invoicesByDate = invoices.stream()
.collect(Collectors.groupingBy(Invoice::getPurchaseDate, // group invoices by Purchase Date
Collectors.mapping(Invoice::getPrice,
Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
System.out.println(invoicesByDate); // {2018-08-28=11, 2018-08-27=10}
}
}
发布于 2018-08-29 04:27:15
使用问题中使用的实际结构,您可以在Map<Integer, List<BigDecimal>>
中收集按月份的第几天分组的BigDecimal
值。
然后对每个条目求和,并将其收集到Map<Integer, BigDecimal>
中。
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.mapping;
import static java.util.stream.Collectors.toMap;
import static java.util.stream.Collectors.toList;
// ...
List<Invoice> invoiceListForMonth = ... ;
Map<Integer, BigDecimal> sumByDayOfMonth =
invoiceListForMonth.stream()
.collect(groupingBy(i -> i.getPurchaseDate()
.getDate(),
mapping(Invoice::getPrice, toList())))
// Map<Integer, List<BigDecimal>> is produced above
.entrySet()
.stream()
.collect(toMap(Entry::getKey, entry -> entry.getValue()
.stream()
.reduce(BigDecimal.ZERO, BigDecimal::add)));
https://stackoverflow.com/questions/52065227
复制相似问题