在GroupingBy中等效的Java 8 Streams API HAVING子句?

5 java stream java-8

我遇到了一个难以解决的问题Streams API.嗯,它是可以解决的但不是优雅的,在我能说的一个电话中.下面,FeatureContentWeight我将根据特征内容对一组对象进行分组,并获得每个特征和内容的最大权重.我从最后得到了值,Map因为我不需要维护Map.问题是,我只想要包含超过3个项目的组.所以我想要超过给定计数的功能,内容对的每个功能和内容的最大权重.在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();
Run Code Online (Sandbox Code Playgroud)

Mic*_*ski 2

从您的描述来看,您似乎想要过滤分组结果的地图。因此,您可以对toMap分组结果应用收集器,然后对其进行过滤values(),以便仅保留长度为 3 或以上的结果。您也可以跳过地图创建并使用partitioningBy收集器,但这可能会更尴尬。

最后,对于转换映射,我发现 Guava 的辅助函数有时Maps.filterValues()提供比 Java 8 更短、更易读的语法(流语法对于列表来说很好,但对于映射有时会变得很糟糕)。如果您使用的是 Java 8,则可以在 Guava 中使用闭包,因此您可以编写如下内容:

Map<A,B> unfiltered = <Java 8 grouping>
return Maps.filterValues(unfiltered, list -> list.size() > 3);
Run Code Online (Sandbox Code Playgroud)