Java 8 迭代两个流并将操作应用于一个流的更好方法是什么
如果有人能想出一个更好的方式来表达它,我将非常感谢对标题的编辑 我有一个类,它表示具有容量的集合 我的密码是Java 8 迭代两个流并将操作应用于一个流的更好方法是什么,java-8,java-stream,Java 8,Java Stream,如果有人能想出一个更好的方式来表达它,我将非常感谢对标题的编辑 我有一个类,它表示具有容量的集合 我的密码是 public class PlayerParty implements Party { public PlayerParty() { this(Collections.emptyList()); } public PlayerParty(Collection<Pokemon> pokemon) { Objects.r
public class PlayerParty implements Party {
public PlayerParty() {
this(Collections.emptyList());
}
public PlayerParty(Collection<Pokemon> pokemon) {
Objects.requireNonNull(pokemon, "pokemon must not be null");
if (pokemon.size() > PARTY_LIMIT) {
throw new IllegalArgumentException(String.format(PARTY_LIMIT_EXCEEDED, PARTY_LIMIT));
}
createPartySlots();
fillPartySlots(pokemon);
}
@Override
public final Iterable<Pokemon> getPokemon() {
return Collections.unmodifiableCollection(
partySlots
.stream()
.filter(PartySlot::isFull)
.map(PartySlot::getPokemon)
.collect(Collectors.toList()));
}
public final Optional<PartySlot> getNextSlot() {
return partySlots
.stream()
.filter(slot -> !slot.isFull())
.findFirst();
}
private void createPartySlots() {
for (int i = 0; i < PARTY_LIMIT; i++) {
partySlots.add(new PartySlot());
}
}
private void fillPartySlots(Iterable<Pokemon> pokemon) {
pokemon.forEach(p -> {
// Since we just added all of the slots, they're
// guaranteed to be present
// noinspection OptionalGetWithoutIsPresent
PartySlot slot = getNextSlot().get();
slot.fill(p);
partySlots.add(slot);
});
}
private static final String PARTY_LIMIT_EXCEEDED = "party cannot have more than %s Pokemon";
private static final int PARTY_LIMIT = 6;
private final List<PartySlot> partySlots = new ArrayList<>();
}
如果缺少值的情况表示存在错误,则可以调用.get()
,而不选中.isPresent()
。如果该值不存在,.get()
将快速失败,出现一个NoTouchElementException
,这可能是您想要的
您可能希望通过使用.orelsetrow(…)
而不是.get()
在代码中更清楚地记录这一点,但这是首选项
另一方面,您使用.filter(slot->!slot.isFull())
建议的代码将自动忽略插槽已满的情况,并使此类错误更难发现。另外,替代的实现在插槽上迭代,而不是在提供的pokemon上迭代,但是如果pokemon的数量比插槽的数量少呢
另外,您是否有充分的理由使用
Iterable
<代码>集合或列表
可能是更合适的选择。考虑到这一点。如果Pokimon比槽少,那么没有一个插槽就很好。我们的想法是最多有6个插槽。必须至少填充1个插槽。所以一个人可以有3个口袋妖怪,并且可以有3个。对,所以当你在插槽上做一个.forEach
,并尝试从Iterable
填充它们时,你必须处理这个问题。这是问题的一部分;我如何能够同时迭代这两个函数,并将它们从Iterable
添加到插槽中。您当前的解决方案很好。您可能想寻找各种方法来“压缩”两条流,但对于您的案例来说,这并不值得费心。
partySlots
.stream()
.filter(slot -> !slot.isFull()) // should return true for all slots
.forEach(slot -> {
slot.fill(nextAvailableOneFromMethodParameter?);
});