Я создаю решатель рейтинга в покере, и мне приходится подсчитывать карты одного и того же ранга в наборе карт. Здесь я создаю 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);
}
Это действительно хорошо! –
мне, '.collect (Collectors.groupingBy (Card :: getRank, Collectors.counting())' выглядит чище ... – Holger
@ Хольгер На самом деле мне тоже. Не знал об этом при публикации этого ответа и создавал код на основе текущие и ограниченные знания.В любом случае вы, кажется, много знаете о Java 8. Могу ли я спросить, откуда взялись ваши знания? Можете ли вы порекомендовать хороший источник информации о нем помимо официального учебника (книг или сайтов/статей)? – Pshemo