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

lin*_*ngz 1 java groovy java-8 java-stream collectors

我正在尝试SELECT MAX(COUNT DISTINCT field_x) FROM stream GROUP BY field_y;使用Java Streams/Collectors在一个groovy脚本中做一个.基本上,我想要一个解决方案COUNT DISTINCT,我可以接受.max.

我一直在尝试这篇文章中的解决方案:java 8 - stream,map和count distinct

但得到错误:

unexpected token: : @ line 65, column 114.
   ")}, Collectors.toSet()), Set::size).val
Run Code Online (Sandbox Code Playgroud)

Groovy中似乎有一个问题Set::sizeMap::size.

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

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

如果这更适合作为评论而道歉,但显然需要更多的声誉来评论而不是提问.

vsm*_*kov 5

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

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

或者(稍微短一些)使用带有隐式参数方法指针运算符的闭包

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

编辑

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

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