Functions { public static <T> Function<List<T>, T> nthOfList(int index) { return list -> list.get(index < 0 ? list.size() + index : index); } private  Functions(); static Function<List<T>, T> firstOfList(); static Function<List<T>, T> lastOfList(); static Function<List<T>, T> nthOfList(int index); static Function<List<T>, List<T>> permutationOfList(
      int... indexes); static Function<List<T>, List<T>> withoutSeparators(); static Function<Object, T> constant(T output);  }
@Test public void testNthOfListOfList() { assertEquals('a', nthOfList(0).apply(ONE)); assertEquals('a', nthOfList(0).apply(TWO)); assertEquals('a', nthOfList(0).apply(THREE)); assertEquals('b', nthOfList(1).apply(TWO)); assertEquals('b', nthOfList(1).apply(THREE)); assertEquals('c', nthOfList(2).apply(THREE)); assertEquals('a', nthOfList(-1).apply(ONE)); assertEquals('b', nthOfList(-1).apply(TWO)); assertEquals('c', nthOfList(-1).apply(THREE)); assertEquals('a', nthOfList(-2).apply(TWO)); assertEquals('b', nthOfList(-2).apply(THREE)); assertEquals('a', nthOfList(-3).apply(THREE)); }