我正在尝试使用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::size
和Map::size
的问题。
我已导入java.util.Map
和java.util.Set
无效。这是Groovy语法/导入Java类的问题还是我如何使用Collectors
的问题?作为参考,我只是尝试在原始后期解决方案中在此地图上实现forEach println:
Map<Integer, Integer> map = bids.stream().collect(
groupingBy(
Bid::getBidderUserId,
collectingAndThen(
mapping(Bid::getAuctionId, toSet()),
Set::size)));
道歉,如果这更适合作为评论,但是显然需要更多的声誉来评论而不是提问。
答案 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 parameter和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()})));