### Question:
CollectionUtils { public static Optional<IntCollection> intersection(Collection<IntCollection> clusters) { List<IntCollection> sorted = sort(clusters, CLUSTER_COMPARATOR); return createIntersector(sorted).map(HeadAndTailIntersector::intersect); }  static List<T> asList(T obj); static IntSet mutableSingleton(int i); static Optional<Entry<V>> ceilingEntry(Double2ObjectSortedMap<V> sortedMap,
		double from); static Optional<V> ceilingValue(Double2ObjectSortedMap<V> sortedMap, double from); static Collection<Tuple2<T, T>> crossProduct(List<T> list); static OptionalDouble first(DoubleSortedSet set); static void forEach(Double2ObjectMap<V> map, DoubleObjectBiConsumer<V> action); static void forEach(Int2ObjectMap<V> map, IntObjectBiConsumer<V> action); static Optional<T> head(List<T> clusters); static Optional<IntCollection> intersection(Collection<IntCollection> clusters); static IntSet merge(IntSet left, IntCollection right); static IntCollection merge(IntCollection left, IntCollection right); static Collection<T> merge(Collection<T> left, Collection<T> right); static Predicate<Collection<T>> sizeBelow(int maxSize); static List<T> sort(Collection<T> collection, Comparator<T> comparator); static Collection<T> tail(List<T> clusters); static Collection<String> toString(Iterable<T> objects);  }### Answer:
@Test public void testIntersection() { List<IntCollection> clusters = ImmutableList.<IntCollection>builder() .add(new IntOpenHashSet(Arrays.asList(1, 2, 3, 4))) .add(new IntOpenHashSet(Arrays.asList(2, 3, 4, 5))) .add(new IntOpenHashSet(Arrays.asList(1, 3, 4))) .build(); Assert.assertThat(CollectionUtils.intersection(clusters), isPresentAnd(hasSize(2))); Assert.assertThat(CollectionUtils.intersection(clusters), isPresentAnd(hasItems(3, 4))); }
@Test public void testIntersectionOfEmpty() { assertThat(CollectionUtils.intersection(Collections.emptyList())).isEmpty(); }