计算具有相同 属性 值的对象

Counting objects with a same property value

我正在创建一个扑克等级求解器,我必须计算一组纸牌中具有相同花色或相同等级的牌。如果集合中有多个等级,我在这里创建 HashMap 并增加值。

private boolean isFourOfAKind() {
        Map<RANK, Integer> rankDuplicates = new HashMap<>();
        for(Card card : cards) {
            rankDuplicates.put(card.getRank(), rankDuplicates.getOrDefault(card.getRank(), 0) + 1);
        }
        return rankDuplicates.containsValue(4);
    }

我想知道是否可以使用流与 java 流做完全相同的事情。它看起来像这样:

    private boolean isFourOfAKind() {
        Map<RANK, Integer> rankDuplicates = cards.stream()
            .map(Card::getRank)
            .collect(Collectors.toMap(/*...something goes here..*/)); // of course this is very wrong, but you can see what I'm aiming at.
        return rankDuplicates.containsValue(4);
    }

您似乎在寻找类似

的东西
return cards.stream()
        .collect(Collectors.toMap(Card::getRank, e -> 1, Integer::sum))
        //                        keyMapper, valueMapper, mergeFunction
        .containsValue(4);

groupingBy 的另一种变体:

import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;

...

private boolean isFourOfAKind() {
    return cards.stream()
                .collect(groupingBy(Card::getRank, counting()))
                .containsValue(4L);

}

基本上你按等级对卡片进行分组,这样你就有了 Map<Rank, List<Card>>

然后你使用下游收集器 counting() 将每个列表映射到它的元素数量,这样最终结果是 Map<Rank, Long> (你也可以使用 summingInt(i -> 1) 而不是counting() 如果你真的需要 Map<Rank, Integer>).