Java 8流:计算值的数量

5

我正在尝试使用Java 8流来获取列表中一组值中对象的出现次数,但我还没有完全掌握它。

我正在尝试做的是:

int threshold = 5;
for (Player player : match) { // match is a Set<Player>
    int count = 0;
    for (Set<Player> existingMatch : matches)
        if (existingMatch.contains(player))
            count++;
    if (count >= threshold )
        throw new IllegalArgumentException("...");
}

我知道我可以使用collectgroupingBy进行分组,并使用筛选器来表明应用的操作是使用新的方法引用运算符contains。但是,我对这些新的Java 8特性还不太熟悉,无法将它们全部结合起来。
那么,如何使用Stream从列表中提取所有值集合中player出现次数的数量呢?

4
我看不到所发布的代码中有任何地图。你为什么要在基于流的等效方法中使用地图? - JB Nizet
1
你想要实现什么功能呢?能否分享一下这样一个地图的示例以及你想要得到的输出结果? - Mureinik
1个回答

7
Lambda表达式可以帮助分离逻辑的不同部分并将它们组合在一起。
根据您的代码,我理解您正在测试玩家是否包含在至少matchesthreshold个元素中。 我们可以将测试逻辑编写如下:
Predicate<Player> illegalTest = player -> matches.stream()
        .filter(m -> m.contains(player))
        .count() >= threshold;

然后我们想要将这个测试应用到所有球员中,以查看是否有任何一个球员匹配:

boolean hasIllegal = match.stream().anyMatch(illegalTest);

最后:
if (hasIllegal) {
    throw new IllegalArgumentException("...");
}

4
在筛选后加上一个 limit(threshold) 会更加高效。 - JB Nizet
1
@JBNizet 我曾经考虑过是否要加入这个,但最终决定保持简单。 - Misha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接