【问题标题】:Java Stream grouping and counting occuerencesJava Stream 分组和计数出现次数
【发布时间】:2019-04-10 17:11:44
【问题描述】:

我有一个代表市场交易的对象列表。每笔交易都有开盘和收盘时间以及利润。我想按一个月对它们进行分组,然后计算每个月利润 > 0 且

我想出了以下代码,但我无法在其中实现条件:

filteredOrders.stream().collect(Collectors.groupingBy(order -> order.getCreationTime().substring(5,7),
                Collectors.groupingBy(order -> order.getPlUsd() > 0, Collectors.counting())));

【问题讨论】:

    标签: java java-stream


    【解决方案1】:

    您可以使用基于order.getPlUsd() > 0/order.getPlUsd() < 0 条件的内联映射:

    Map<String, Map<String, Long>> monthPlusdGroups = 
        filteredOrders.stream()
        .collect(Collectors.groupingBy(order -> order.getCreationTime().substring(5, 7),
                 Collectors.groupingBy(order -> order.getPlusd() > 0 ? "Win" : "Loss", 
                                       Collectors.counting())));
    

    请注意,此实现 (order.getPlusd() &gt; 0 ? "Win" : "Loss") 将 0 美元的利润归类为“亏损”。

    【讨论】:

    • partitioningBy 怎么样?
    • @Naman 我想也可以使用它,但我认为分类不会是二元的,而且条件必须比这更复杂
    • 非常感谢,我刚刚添加了一个过滤器来摆脱 0$:filteredOrders.stream() .filter(order -&gt; order.getPlUsd() != 0) .collect(Collectors.groupingBy(order -&gt; order.getCreationTime().substring(5, 7), Collectors.groupingBy(order -&gt; order.getPlUsd() &gt; 0 ? "Win" : "Loss", Collectors.counting())));
    猜你喜欢
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 2017-03-24
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    相关资源
    最近更新 更多