code: public final <V> V getProperty(final String name, final Class<V> type) {
          Preconditions.checkNotNull(name);
          try {
              Object value = null;
              synchronized (this.state) {
                  if (this.state.properties != null) {
                      value = this.state.properties.get(name);
                  }
              }
              return Data.convert(value, type);
          } catch (final Throwable ex) {
              throw Throwables.propagate(ex);
          }
      }
docs: Returns 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 type
  the type of the property value (conversion will be attempted if available value
  has a different type)
  @param <V>
  the type of value
  @return the value of the property, or null if the property is undefined