private List<AggregateEvent> asList(AggregateEventStream AggregateEventStream) {
   List<AggregateEvent> unseenEvents = new ArrayList<AggregateEvent>();
   while (AggregateEventStream.hasNext()) {
     unseenEvents.add(AggregateEventStream.next());
   }
   return unseenEvents;
 }
  /**
   * 根据聚合标识符和 指定 版本加载 聚合
   *
   * @param aggregateIdentifier the identifier of the aggregate to load
   * @param expectedVersion The expected version of the loaded aggregate
   * @return the fully initialized aggregate
   */
  @Override
  protected T doLoad(ID aggregateIdentifier, final Long expectedVersion) {
    AggregateEventStream events = null;
    AggregateEventStream originalStream = null;
    try {
      try {
        events = AggregateEventStore.readEvents(getTypeIdentifier(), aggregateIdentifier);
      } catch (EventStreamNotFoundException e) {
        throw new AggregateNotFoundException(aggregateIdentifier, "The aggregate was not found", e);
      }
      originalStream = events;
      for (EventStreamDecorator decorator : eventStreamDecorators) {
        events = decorator.decorateForRead(getTypeIdentifier(), aggregateIdentifier, events);
      }

      final T aggregate = aggregateFactory.createAggregate(aggregateIdentifier, events.peek());
      List<AggregateEvent> unseenEvents = new ArrayList<AggregateEvent>();
      aggregate.initializeState(new CapturingEventStream(events, unseenEvents, expectedVersion));
      if (aggregate.isDeleted()) {
        throw new AggregateDeletedException(aggregateIdentifier);
      }
      CurrentUnitOfWork.get()
          .registerListener(new ConflictResolvingListener(aggregate, unseenEvents));

      return aggregate;
    } finally {
      IOUtils.closeQuietlyIfCloseable(events);
      // if a decorator doesn't implement closeable, we still want to be sure we close the original
      // stream
      IOUtils.closeQuietlyIfCloseable(originalStream);
    }
  }
 @Override
 public AggregateEvent next() {
   AggregateEvent next = eventStream.next();
   if (expectedVersion != null && next.getSequenceNumber() > expectedVersion) {
     unseenEvents.add(next);
   }
   return next;
 }
 @Override
 public AggregateEvent peek() {
   return eventStream.peek();
 }
 @Override
 public boolean hasNext() {
   return eventStream.hasNext();
 }