有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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";
}

共 (2) 个答案

  1. # 1 楼答案

    我建议您使用Java 8 lambdas对现有代码使用以下解决方案,它需要将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
    }
    
    <>而不是返回^ {< CD6>},您可以考虑将^ {< CD7>}的签名更改为^ {CD8>}。

  2. # 2 楼答案

    一行:

       IntStream.range(0,getHand()::size).filter(i -> super.getHand().get(i).isCompatible(flipped))
                    .mapToObj(Integer::new).findFirst().map(this::discard).orElse(null);
    

    有必要mapToObj,因为int类型的Optional上的map函数不存在。可悲的是,java缺乏对配对的本机支持,这会让它不那么难看。它可以“索引流”。但要记住:流是无限的,因此没有索引