Вот решение, которое обходит ваш список только один раз, давая вам первые красные и синие игрушки в конце. Мы можем отфильтровать все другие нежелательные цвета и затем создать карту, ключом которой является то, является ли игрушка красной, и значение - первая игрушка, соответствующая заданным критериям. Вот как это выглядит.
Map<Boolean, Toy> firstRedAndBlueToysMap = toyList.stream()
.filter(t -> t.isBlue() || t.isRed())
.collect(Collectors.toMap(Toy::isRed, t -> t, (a, b) -> a));
Toy firstRedToy = firstRedAndBlueToysMap.get(true);
Toy firstBlueToy = firstRedAndBlueToysMap.get(false);
А вот пошаговый подход к решению вашей проблемы.
RedBlueExtravaganza firstRedAndBlueToyPair = toyList.stream()
.filter(t -> t.isBlue() || t.isRed())
.collect(Collectors.collectingAndThen(Collectors.toMap(Toy::isRed,
t -> t, (a, b) -> a),
m -> new RedBlueExtravaganza(m.get(true), m.get(false))));
PS Чтобы это работало, в вашем * 1007 должен быть следующий конструктор* класс, противоположный тому, который вы указали выше.
public RedBlueExtravaganza(Toy rt, Toy bt) {
if (!(rt instanceof RedToy) || !(bt instanceof BlueToy))
throw new IllegalArgumentException();
// remainder omitted.
}