import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.function.*; import java.util.stream.Collectors; import java.util.stream.Stream; class ListOps { static List append(final List list1, final List list2) { final List result = new ArrayList<>(); result.addAll(list1); result.addAll(list2); return result; } static List concat(final List> listOfLists) { final List result = new ArrayList<>(); listOfLists.forEach(result::addAll); return result; } static List filter(final List list, Predicate predicate) { return list.stream().filter(predicate).collect(Collectors.toList()); } static int size(final List list) { return list.size(); } static List map(final List list, Function transform) { return list.stream().map(transform).collect(Collectors.toList()); } static List reverse(final List list) { final List result = new ArrayList<>(list); Collections.reverse(result); return result; } static U foldLeft(final List list, final U initial, final BiFunction f) { if (list.isEmpty()) return initial; return foldLeft( new ArrayList<>(list.subList(1, list.size())), f.apply( initial, list.get(0)), f); } static U foldRight(final List list, final U initial, final BiFunction f) { if (list.isEmpty()) return initial; return f.apply( list.get(0), foldRight( new ArrayList<>(list.subList(1, list.size())), initial, f)); } private ListOps() { // No instances. } }