我是 Java 8 lambda 和流的新手。为了练习,我试图尽可能地将学校项目中的一些方法“翻译”成 lambdas/streams。 这是旧方法。
如你所见,我需要给 discard 方法一个 int,这是玩家手中的第一张可玩牌的编号。
public Card autoPlay(Card flipped) {
for (int i = 0; i < super.getHand().size(); i++) {
if (super.getHand().get(i).isCompatible(flipped)) { //check if card from hand is compatible with flipped card (same number or color)
return (this.discard(i)); //remove from hand and returns it
}
}
return null; //if any compatible card found
}
到目前为止,我的方法的新版本是:
public Card newAutoPlay(Card flipped){
return super.getHand().stream().filter(card -> card.isCompatible(flipped)).findFirst().get();
}
我找到了如何获得第一张兼容卡,但不知道如何获得它的索引...我阅读了有关 IntStreams 的内容(并使用列表的大小作为范围),但我不明白如何使用在这种特殊情况下。
是否有可能实现我想要做的事情,或者这样做不是一个好主意?
编辑:在探讨了这个问题之后,在这种情况下使用流带来了太多的复杂性和解决这个简单问题的可读性不足。所以我选择了一个for循环。还有一些其他的变化,但核心思想保持不变。感谢大家的帮助。
@Override
public String play(Uno unoGame) {
int i = 0;
boolean found = false;
for (i = 0; i < super.getHand().size() && !found; i++) {
found = super.getHand().get(i).isCompatible(unoGame.getFlippedCard());
}
return found ? "play " + i : "draw";
}
最佳答案
我建议使用 Java 8 lambda 对您现有的代码使用以下解决方案,这需要更改 discard(int index)
的签名至 discard(Card card)
,假设 Card
执行equals(Object obj)
和 hashCode()
:
public Card autoPlay(Card flipped) {
Optional<Card> card = getHand().stream()
.filter(flipped::isCompatible)
.findFirst();
card.ifPresent(this::discard);
return card.orElse(null);
}
private void discard(Card card) {
// your code removing the first matching card from your hand
}
而不是返回 null
您可以考虑更改 Card autoPlay(Card flipped)
的签名至 Optional<Card> autoPlay(Card flipped)
.
关于java - 使用 Java8 Streams 时是否可以获取 ArrayList<Object> 的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42788751/