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

时间:2016-09-01 17:32:11

标签: java groovy java-8 java-stream collectors

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

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

但得到错误:

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

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)));

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

1 个答案:

答案 0 :(得分:5)

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

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

或者(稍微短暂)使用implicit parametermethod 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()})));