code: public final Stream<T> setProperty(final String name, @Nullable final Object value) {
          Preconditions.checkNotNull(name);
          synchronized (this.state) {
              if (this.state.properties != null) {
                  this.state.properties.put(name, value);
              } else if (value != null) {
                  this.state.properties = Maps.newHashMap();
                  this.state.properties.put(name, value);
              }
          }
          return this;
      }
docs: Sets a metadata property about the stream. Note that {@code Stream} wrappers obtained
  through intermediate operations don't have their own properties, but instead access the
  metadata properties of the source {@code Stream}.
  
  @param name
  the name of the property
  @param value
  the value of the property, null to clear it
  @return this {@code Stream}, for call chaining