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::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)));
Run Code Online (Sandbox Code Playgroud)
如果这更适合作为评论而道歉,但显然需要更多的声誉来评论而不是提问.
不幸的是,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)
| 归档时间: |
|
| 查看次数: |
333 次 |
| 最近记录: |