首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用java 8中的lambda函数获取ArrayList的总数,并按日期分组。

使用java 8中的lambda函数获取ArrayList的总数,并按日期分组。
EN

Stack Overflow用户
提问于 2018-08-29 03:46:58
回答 3查看 280关注 0票数 1

我有一个发票的模型类,它包含购买日期和价格。

Class Invoice{
    Date purchaseDate;
    BigDecimal price;
    //getters and setters
}

我得到了发票列表,其中包含一个月内售出的产品的所有发票:

List<Invoice> invoiceListForMonth;

我想在每个月的每一天完成总销售额。

List<BigDecimal> dayWiseSales;

如何在java 8中使用lambda函数获取列表中的数据?

EN

回答 3

Stack Overflow用户

发布于 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();
票数 3
EN

Stack Overflow用户

发布于 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}
    }
}
票数 1
EN

Stack Overflow用户

发布于 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)));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52065227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档