作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在 Streams API
中遇到了一个难以解决的问题。好吧,据我所知,它是可以解决的,但在一次调用中并不优雅。下面,采用 FeatureContentWeight
对象流,我想按 feature 和 content 分组并获得每个最大权重功能和内容。我在最后从 Map
中获取值,因为我不需要维护 Map
。问题是,我只想要包含超过 3 个项目的组。因此,我想要超过给定计数的Feature,Content 对 的每个功能和内容的最大权重。在 SQL
中,这只是一个简单的 HAVING
子句。在 Streams API
中,它看起来并不微不足道,但我现在才使用 Streams API
几天。
任何想法表示赞赏。以下是我的方法,
List<FeatureContentWeight> nearestNeighbors = neighborPostings
.stream()
.collect(
groupingBy(
p -> FeatureContent.Create(p.getFeatureId(), p.getContentId()),
collectingAndThen(maxBy(comparingDouble(FeatureContentWeight::getWeight)),Optional::get))).values();
最佳答案
正如您所注意到的,不幸的是,JDK 的 Stream
API 中没有流式 GROUP BY
操作(即使有流式 distinct()
操作)。 collect()
是一个终端操作,它将组和聚合收集到具体的 Map
中。
但是,如本 article showing SQL clauses and their equivalents in Java 8 Streams 中所述,您可以重新流式传输 Map.entrySet()
并对其执行进一步的操作。
应用于您的代码(我在这里做了一些假设):
Map<FeatureContentWeight, Double> nearestNeighbors = neighborPostings
.stream()
// GROUP BY featureId, contentId
.collect(
groupingBy(
p -> FeatureContent.Create(p.getFeatureId(), p.getContentId())
)
)
// HAVING count(*) >= 3
.entrySet()
.stream()
.filter(e -> e.getValue().size() >= 3)
// SELECT grp, MAX(weight)
.map(e -> e.getValue().stream().collect(
maxBy(comparingDouble(w -> w.getWeight))
));
关于Java 8 Streams API HAVING 子句等同于 GroupingBy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26818307/
我是一名优秀的程序员,十分优秀!