code: @Override
      @SuppressWarnings("unchecked")
      public <V> Iterator<Property<V>> properties(String... propertyKeys) {
          Objects.requireNonNull(propertyKeys, "propertyKeys cannot be null");
          // check filter is a single property
          if (propertyKeys.length == 1) {
              // property value
              Property<V> propertyValue = properties.get(propertyKeys[0]);
              if (propertyValue != null) {
                  // return iterator
                  return Collections.singleton(propertyValue).iterator();
              }
              return Collections.emptyIterator();
          }
          // no properties in filter
          if (propertyKeys.length == 0) {
              // all properties (return a copy since properties iterator can be modified by calling remove())
              return properties.values().stream()
                  .map(value -> (Property<V>)value)
                  .collect(Collectors.toList())
                  .iterator();
          }
          // filter properties (return a copy since properties iterator can be modified by calling remove())
          return Arrays.stream(propertyKeys)
              .map(key -> (Property<V>)properties.get(key))
              .filter(Objects::nonNull)
              .collect(Collectors.toList())
              .iterator();
      }
docs: {@inheritDoc}