计算具有相同 属性 值的对象
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>
).
我正在创建一个扑克等级求解器,我必须计算一组纸牌中具有相同花色或相同等级的牌。如果集合中有多个等级,我在这里创建 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>
).