我正在尝试使用 Java 流/收集器在常规脚本中执行 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
的方式的问题?作为引用,我只是尝试在原始帖子解决方案的这张 map 上实现 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和 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()})));
关于Java 流收集器在 Set::size 上出现 groovy 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39277655/