Ваш метод next()
не должен содержать ни одного регистра, который бы возвращал недопустимое значение, например null
. Если нет следующего элемента, который должен быть возвращен, это hasNext()
метод job , который возвращает false
, чтобы вы не могли вызвать next()
.
Так что ваш код должен выглядеть как
class SpadeIterator implements Iterator<Card>{
private int spadesCounter = 0;
private Iterator<Card> cardsIt;
private SpadeIterator(List<Card> cards) {
cardsIt = cards.iterator();
}
@Override
public boolean hasNext() {
return spadesCounter<13; // we can't put spacesCounter++ here because
// we should be able to call `hasNext()` many times
// and still get same answer,
// so `hasNext()` shouldn't change any state
// (at least one which could cause changing its result)
}
@Override
public Card next() {
Card temp = cardsIt.next(); //if our `hasNext()` returned `false` but we
//didn't check or ignored it, this will CORRECTLY
//throw NoSuchElementException
while(temp.suit.value != Suit.SPADES.value){
temp = cardsIt.next();
}
spadesCounter++;
return temp;
}
}
ИЛИ, если вы просто хотите перебирать список и печатать только выбранные элементы, вы можете использовать потоки с фильтрацией, например
List<Card> cards = ...//not really important how get it
cards.stream()
.filter(card -> card.suit.value == Suit.SPADES.value)
.forEach(card -> System.out.println(card));
или даже проще
for (Card card : cards){
if(card.suit.value == Suit.SPADES.value){
System.out.println(card);
}
}