import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.function.BiFunction; import java.util.function.BinaryOperator; import java.util.function.Predicate; import java.util.function.UnaryOperator; import java.util.stream.Collectors; import java.util.stream.Stream; public class ListOps { private ListOps() { } public static int length(final List list) { return list.size(); } public static List reverse(final List list) { List result = new ArrayList(list); Collections.reverse(result); return result; } public static List map(final List list, UnaryOperator mapper) { return list.stream().map(mapper).collect(Collectors.toList()); } public static List filter(final List list, Predicate predicate) { return list.stream().filter(predicate).collect(Collectors.toList()); } public static U reduce(final List list, U identity, BiFunction accumulator, BinaryOperator combiner) { return list.stream().reduce(identity, accumulator, combiner); } public static List concat(final List... lists) { return Stream.of(lists) .flatMap(Collection::stream) .collect(Collectors.toList()); } }