import java.util.*; import java.util.stream.Collectors; class Test { private List bar(List list) { return null; } private List> foo(List l) { foo(bar(l)); final List> perms = foo(null); return null; } public static List pipe(E head, List tail) { List newList = new ArrayList<>(tail); newList.add(0, head); return newList; } public static List subtract(List list, E e) { List newList = new ArrayList<>(list); newList.remove(e); return newList; } public static List> perms(List l) { return l.isEmpty() ? Collections.singletonList(Collections.emptyList()) : l.stream().flatMap(h -> perms(subtract(l, h)).stream() .map(t -> pipe(h, t))).collect(Collectors.toList()); } public static void main(String[] args) { System.out.println(perms(Arrays.asList("a", "b", "c"))); } }