java使用Java8 Streams时是否可以获取ArrayList<Object>的索引?
我对Java8Lambdas和streams是新手。为了练习,我尝试在可能的情况下将学校项目中的一些方法“翻译”为lambdas/streams。 这是老办法
正如你所看到的,我需要给丢弃方法一个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";
}
# 1 楼答案
我建议您使用Java 8 lambdas对现有代码使用以下解决方案,它需要将
<>而不是返回^ {< CD6>},您可以考虑将^ {< CD7>}的签名更改为^ {CD8>}。discard(int index)
的签名更改为discard(Card card)
,假设Card
确实实现了equals(Object obj)
和hashCode()
:# 2 楼答案
一行:
有必要
mapToObj
,因为int
类型的Optional
上的map
函数不存在。可悲的是,java缺乏对配对的本机支持,这会让它不那么难看。它可以“索引流”。但要记住:流是无限的,因此没有索引