如何使用 stream() in Java 8 检查列表中的任何元素是否出现 x 次

How to check if any element in a list occurs x number of times with stream() in Java 8

假设你有一组纸牌,包含一套花色和一张脸:

Collection<Card> cards = Arrays.asList(new Card('H',6),new Card('H',3), new Card('H',9), new Card('H',4),new Card('S', 1), new Card('H', 2), new Card('D', 12), new Card('S',7), new Card('C', 13));

记住扑克规则; 在 java 8 中使用 stream(),如果列表包含刷新,是否有返回布尔语句的漂亮方法? (列表中有五张牌花色相同)

到目前为止,我只能通过手动检查每套花色来做到这一点,如下所示:

long s= cards.stream()
            .filter(x->x.getSuit()=='S')
            .count();
long d= cards.stream()
            .filter(x->x.getSuit()=='D')
            .count();
long h= cards.stream()
            .filter(x->x.getSuit()=='H')
            .count();
long c= cards.stream()
            .filter(x->x.getSuit()=='C')
            .count();
if (s==5 || d==5|| h==5||c==5) {
    System.out.println(true);
}
boolean hasFlush = 
    Arrays.stream(new int[] {'S', 'D', 'H', 'C'})
          .anyMatch(suit -> cards.stream()
                                 .filter(x -> x.getSuit() == suit)
                                 .count() == 5);
boolean hasFlush = cards.stream()
     .collect(Collectors.groupingBy(x -> x.getSuit(), Collectors.counting()))
     .values().stream().anyMatch(x -> x == 5);

它的性能不如 anyMatch,但您可以按花色分组并检查是否有值 5。

boolean hasFlush = cards.stream()
                        .collect(groupingBy(Card::getSuit, counting())
                        .containsValue(5L);