Java groovy 中的流收集器在 Set::size 上出错

Java stream collectors in groovy error on Set::size

我正在尝试使用 Java 流/收集器在 groovy 脚本中执行 SELECT MAX(COUNT DISTINCT field_x) FROM stream GROUP BY field_y;。基本上,我想要 COUNT DISTINCT 的解决方案,然后我可以将其输入 .max

我一直在尝试这个 post 的解决方案:

但是出现错误:

unexpected token: : @ line 65, column 114.
   ")}, Collectors.toSet()), Set::size).val

Groovy 似乎与 Set::sizeMap::size 有问题。

我导入了 java.util.Mapjava.util.Set 都无济于事。这是 Groovy 语法/导入 Java 类 的问题还是我使用 Collectors 的方式的问题?作为参考,我只是尝试在原始 post 解决方案的这张地图上实现 forEach println:

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

抱歉,如果这作为评论更合适,但显然发表评论比提出问题需要更多的声誉。

不幸的是 groovy 不接受 java 方法引用语法,但是您可以使用闭包并像这样重写它

Map<Integer, Integer> map = bids.stream().collect(
    groupingBy(
            {bid -> bid.bidderUserId},
            collectingAndThen(
                    mapping({bid -> bid.auctionId}, toSet()),
                    {set -> set.size()})));

或者(短一点)使用闭包 implicit parameter and method pointer operator

Map<Integer, Integer> map = bids.stream().collect(
    groupingBy(
            {it.&getBidderUserId()},
            collectingAndThen(
                    mapping({it.&getAuctionId()}, toSet()),
                    {it.&size()})));

编辑

甚至更短(归功于 @cfrick):

Map<Integer, Integer> map = bids.stream().collect(
    groupingBy(
            {it.bidderUserId},
            collectingAndThen(
                    mapping({it.auctionId}, toSet()),
                    {it.size()})));