public static <GItem> Set<GItem> intersectionSet(final Set<? extends GItem> items1, final Set<? extends GItem> items2) throws NullPointerException {
		if (items1 == null) throw new NullPointerException("items1 = null");
		if (items2 == null) throw new NullPointerException("items2 = null");
		return new AbstractSet<GItem>() {

			@Override
			public int size() {
				return Iterables.size(this);
			}

			@Override
			public Iterator<GItem> iterator() {
				return Iterators.unmodifiableIterator(items1.size() < items2.size() //
					? Iterators.filteredIterator(Filters.containsFilter(items2), items1.iterator()) //
					: Iterators.filteredIterator(Filters.containsFilter(items1), items2.iterator()) //
				);
			}

			@Override
			public boolean contains(final Object item) {
				return items1.contains(item) && items2.contains(item);
			}

		};
	}