遍历集合<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
循环。
我有以下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
循环。