Java tutorial
//package com.java2s; import java.util.*; import java.util.function.Function; public class Main { public static <T, U> List<U> mapViaFoldLeft(List<T> list, Function<T, U> f) { return foldLeft(list, list(), x -> y -> append(x, f.apply(y))); } public static <T, U> U foldLeft(List<T> ts, U identity, Function<U, Function<T, U>> f) { U result = identity; for (T t : ts) { result = f.apply(result).apply(t); } return result; } public static <T> List<T> list() { return Collections.emptyList(); } public static <T> List<T> list(T t) { return Collections.singletonList(t); } public static <T> List<T> list(List<T> ts) { return Collections.unmodifiableList(new ArrayList<>(ts)); } @SafeVarargs public static <T> List<T> list(T... t) { return Collections.unmodifiableList(Arrays.asList(Arrays.copyOf(t, t.length))); } public static <T> List<T> append(List<T> list, T t) { List<T> ts = copy(list); ts.add(t); return Collections.unmodifiableList(ts); } private static <T> List<T> copy(List<T> ts) { return new ArrayList<>(ts); } }