java - 使用 Java8 Streams 时是否可以获取 ArrayList<Object> 的索引?

标签 java arraylist lambda java-8 java-stream

我是 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/

相关文章:

java - Android 上的 HighChart 动态更新

java - Kotlin从xml转换为具有样式的html

c# - .NET - 将语句 lambda 主体转储到字符串

sorting - Java8 Streams 中的惰性排序(),需要在每次迭代时求助

java - 在 Java 8 中从 Stream of Streams 中提取 Map<K, Multiset<V>>

java - 在 JSF 中使用 Facades 模式,仅在一个实体中,实体管理器为 Null

java - ArrayList : java. util.LinkedHashMap 的迭代器错误无法转换为 MyObject

java - 如何从 Spring RestTemplate 中的对象获取列表

java - 为什么 addAll 会清除从中提取数据的 ArrayList?

Java 8 函数式编程 - 需要在类上编写通用函数