### Question:
CollectionUtils { public static <V> Optional<Entry<V>> ceilingEntry(Double2ObjectSortedMap<V> sortedMap, double from) { Iterable<Entry<V>> entrySet = ceilingEntrySet(sortedMap, from); Iterator<Entry<V>> it = entrySet.iterator(); return IteratorUtils.next(it); }  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 testCeilingEntry() { Double2ObjectSortedMap<String> map = new Double2ObjectRBTreeMap<>(); map.put(0.1, "foo"); map.put(0.2, "bar"); assertThat(ceilingEntry(map, 0.05).map(Entry::getDoubleKey)).hasValue(0.1); assertThat(ceilingEntry(map, 0.1).map(Entry::getDoubleKey)).hasValue(0.1); assertThat(ceilingEntry(map, 0.15).map(Entry::getDoubleKey)).hasValue(0.2); assertThat(ceilingEntry(map, 0.2).map(Entry::getDoubleKey)).hasValue(0.2); assertThat(ceilingEntry(map, 0.25)).isEmpty(); }