当前位置: 首页 > 知识库问答 >
问题:

java 8-不同的流、映射和计数

东郭腾
2023-03-14

我有一个对象出价,它代表一个用户在拍卖中对一个物品的出价。我有一个出价的列表,我想做一个地图,计算在多少(不同的)拍卖的用户作出一个出价。

这是我的看法:

bids.stream()
         .collect(
             Collectors.groupingBy(
                  bid ->  Bid::getBidderUserId, 
                  mapping(Bid::getAuctionId, Collectors.toSet())
             )
         ).entrySet().stream().collect(Collectors.toMap(
             e-> e.getKey(),e -> e.getValue().size())
        );

它起作用了,但我觉得我在作弊,因为我流式处理地图的入口集,而不是对初始流进行操作...一定是个更正确的方法,但我想不出来...

共有1个答案

申高卓
2023-03-14

您可以执行groupingby两次:

Map<Integer, Map<Integer, Long>> map = bids.stream().collect(
        groupingBy(Bid::getBidderUserId,
                groupingBy(Bid::getAuctionId, counting())));

这样你就有了每个用户在每次拍卖中有多少出价。所以内部地图的大小就是用户参与拍卖的次数。如果不需要附加信息,可以执行以下操作:

Map<Integer, Integer> map = bids.stream().collect(
        groupingBy(
                Bid::getBidderUserId,
                collectingAndThen(
                        groupingBy(Bid::getAuctionId, counting()),
                        Map::size)));

这正是您所需要的:将用户映射到用户参与的拍卖数量。

Map<Integer, Integer> map = bids.stream().collect(
        groupingBy(
                Bid::getBidderUserId,
                collectingAndThen(
                        mapping(Bid::getAuctionId, toSet()),
                        Set::size)));
 类似资料:
  • 问题内容: 我第一次尝试使用Java 8流… 我有一个对象Bid,它表示用户对拍卖项目的出价。我有一个投标清单,我想制作一张地图,计算出用户投标的拍卖次数(不同)。 这是我的看法: 它有效,但是我感觉自己在作弊,因为我流式传输了地图的条目集,而不是在初始流上进行了操作……这一定是更正确的方法,但是我无法确定出来… 谢谢 问题答案: 您可以执行两次: 这样,您就可以确定每个用户在每次拍卖中有多少个出

  • 我正在从文件中读取值并获取列表。如下- 一旦我得到这个

  • 假设我有一张房间清单 每个房间都有一份人员名单。 使用java8 streams,我想迭代房间列表,获取所有人员,在每个节点上执行一些方法(doSomething()),并获取所有过滤对象的列表。 这是使用java 8的最佳实践吗?

  • 我有以下两门课: : : 我希望进行流操作,以便: 将映射到中的 的和分别合并到和中,对于所有具有相同id的s 为此,我编写了以下一段代码: 它的工作和输出如下: 但我相信有一种更好的方式可以达到同样的效果。任何一个指针都很好。

  • 我有一个类具有以下签名: 我想将映射到在单个流中同时包含stringA和stringB的 或: 当然他们都不编译,但你明白了。 编辑: 示例:

  • 我在迭代一个对象内的列表时遇到了一个问题,该对象内嵌在另一个映射中。我的目标是迭代这个列表并生成一个映射 ,我希望使用streams和lamdas来实现这一点。 我在上面看到了,我需要通过迭代FolderBo中的elementList从elementBo创建一个带有map 的映射。folderBo本身就在Modelbo的地图内。