Java 8 Streams API HAVING子句在GroupingBy中等效吗? - java

我在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();

参考方案

从您的描述看来,您似乎要过滤作为分组结果的地图。因此,您可以对分组结果应用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);

Java 8-Streams API-在LIST上操作 - java

我有一个包含以下内容的ArrayList-CHENNAI,MUMBAI,DELHI,CHENNAI,DELHI,CHENNAI。另外,假设将这3个城市名称定义为ENUM,并针对每个城市指定一个值。 (CHENNAI = 1,MUMBAI = 2和DELHI = 3)在Java 8 Streams中,我能够计算城市值的总和,在这种情况下,城市值的总和将为1 +…

检查Optional中是否存在null属性,并返回String Java Stream API - java

我有以下class Person private String firstName; private String familyName; // Setters and Getters 我有以下方法public String getFullName(Optional<Person> persons) { return persons .map(p…

Java 8`Stream`可以并行运行,甚至不需要您吗? - java

如我所见,在使用Java 8 Stream时,显而易见的代码无论是“对象”流还是原始流(即IntStream和朋友)都将仅使用:someStreamableResource.stream().whatever() 但是,然后,相当多的“流媒体资源”也有了.parallelStream()。读取javadoc时不清楚的是.stream()流是否始终是顺序的,以…

Java的Geocoder API - java

我正在尝试使用位于http://code.google.com/p/geocoder-java/的java的Geocoder API这些是我编写的代码行,当我将其作为GAE Web应用程序运行时,它可以完美地工作。 final Geocoder geocoder = new Geocoder(); GeocoderRequest geocoderReques…

JAVA 8具有任何匹配属性的对象的过滤器列表 - java

我的要求是通过匹配任何属性的字符串来过滤对象列表。例如,假设Contact类具有三个属性:街道,城市,电话。我知道java流过滤器是如何工作的,在这里我必须将输入字符串与每个属性进行比较,如下所示:contactList.stream().filter(contact -> contact.getStreet().equals("dubai&…