遍历集合<Object>

Iterating over Collection<Object>

我有以下Collection<Player>

    public interface Player {
    String getUsername();

    int getHealth();

    int getArmor();

    Gun getGun();

    boolean isAlive();

    void takeDamage(int points);
}

由两个相同的类

实现

TeamOne 和 TeamTwo

public class TeamOne implements Player {

    private String username;
    private int health;
    private int armor;
    private boolean isAlive;
    private Gun gun;

    protected TeamOne(String username, int health, int armor, Gun gun) {
        this.setUsername(username);
        this.setHealth(health);
        this.setArmor(armor);
        this.setGun(gun);
 }

然后我从 Collection 创建了两个 List teamOne 和 List teamTwo

List<Player> teamOne = players.stream().filter(p instanceof TeamOne).collect(Collectors.toList());
List<Player> teamTwo = players.stream().filter(p instanceof TeamTwo).collect(Collectors.toList());

有没有办法从两个列表创建流并创建以下函数,因为我们不知道它们的大小可能不相等

teamOne.member.takeDamage(teamTwo.member.getGun.fire())

我试过这个

BiConsumer<List<Player>, Player> action = (f, s) -> {

            f.stream().filter(Player::isAlive).forEach(p -> p.takeDamage(s.getGun().fire()));



        };


  while (teamOne.stream().anyMatch(Player::isAlive) && teamTwo.stream().anyMatch(Player::isAlive)) {

teamOne.stream().filter(Player::isAlive).forEach(t -> action.accept(teamTwo, t));
teamTwo.stream().filter(Player::isAlive).forEach(t -> action.accept(teamOne, t));
}

但我认为我的方法是错误的,在这种情况下我做了更多的迭代

对于 teamOne/teamTwo 的每个成员,我想我确实迭代了整个 teamTwo/teamOne。

假设您仅遵循@LouisWasserman’s 一名玩家的建议 class 和该玩家团队的一个字段,则构建团队变为:

    List<Player> teamOne = players.stream()
            .filter(p -> p.getTeamNumber() == 1)
            .collect(Collectors.toList());

第二组相似。

我不会使用流操作来触发。如果你仍然想这样做,这里有一个方法:

    teamTwo.stream()
            .filter(Player::isAlive)
            .forEach(p2 -> teamOne.stream()
                    .filter(Player::isAlive)
                    .forEach(p1 -> p1.takeDamage(p2.getGun().fire())));

我更喜欢嵌套 for 循环。