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?);
    });