code: public void addItem(long seq, Object item) {
          assert size < maxSize;
          readCount++;
  
          Data resultItem;
          if (filter != null || predicate != null || projection != null) {
              final O objectItem = serializationService.toObject(item);
              final boolean passesFilter = filter == null || filter.apply(objectItem);
              final boolean passesPredicate = predicate == null || predicate.test(objectItem);
              if (!passesFilter || !passesPredicate) {
                  return;
              }
              if (projection != null) {
                  resultItem = serializationService.toData(projection.transform(objectItem));
              } else {
                  resultItem = serializationService.toData(item);
              }
          } else {
              resultItem = serializationService.toData(item);
          }
  
          items[size] = resultItem;
          seqs[size] = seq;
          size++;
      }
docs: Applies the {@link Projection} and adds an item to this {@link ReadResultSetImpl} if
  it passes the {@link Predicate} and {@link IFunction} with which it was constructed.
  The {@code item} may be in serialized or deserialized format as this method will
  adapt the parameter if necessary before providing it to the predicate and projection.
  <p>
  If the {@code item} is in {@link Data} format and there is no filter, predicate or projection,
  the item is added to the set without any additional serialization or deserialization.
  
  @param seq  the sequence ID of the item
  @param item the item to add to the result set