gpt4 book ai didi

Java 8 Streams API HAVING 子句等同于 GroupingBy?

转载 作者:搜寻专家 更新时间:2023-10-31 20:11:14 25 4
gpt4 key购买 nike

我在 Streams API 中遇到了一个难以解决的问题。好吧,据我所知,它是可以解决的,但在一次调用中并不优雅。下面,采用 FeatureContentWeight 对象流,我想按 featurecontent 分组并获得每个最大权重功能和内容。我在最后从 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com