如何使用 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);
假设你有一组纸牌,包含一套花色和一张脸:
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);