使用lambda表达式和Streams将端口Erlang置换函数转换为Java 8

Tho*_*ont 5 java erlang java-8

是否可以仅使用Java 8 lambda表达式和Java 8流编写以下Erlang代码?这来自List Comprehensions 3.3 Permutations

perms([]) -> [[]];
perms(L)  -> [[H|T] || H <- L, T <- perms(L--[H])].
Run Code Online (Sandbox Code Playgroud)

Sea*_*der 7

使用三元op替换模式匹配,使用flatMap替换多个生成器,并使用静态方法来实现 和 - 操作:

import static java.util.stream.Collectors.toList;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Example {

    public static <E> List<E> pipe(E head, List<E> tail) {
        List<E> newList = new ArrayList<>(tail);
        newList.add(0, head);
        return newList;
    }

    public static <E> List<E> subtract(List<E> list, E e) {
        List<E> newList = new ArrayList<>(list);
        newList.remove(e);
        return newList;
    }

    public static <E> List<List<E>> perms(List<E> l) {
        return l.isEmpty()
                ? Collections.singletonList(Collections.emptyList())
                : l.stream().<List<E>> flatMap(h -> perms(subtract(l, h)).stream().map(t -> pipe(h, t)))
                        .collect(toList());
    }

    public static void main(String[] args) {
        List<String> list = Arrays.asList(new String[] { "b", "u", "g" });
        System.out.println(perms(list));
    }
}
Run Code Online (Sandbox Code Playgroud)

.<List<E>> flatMap(由于Java编译器的类型推断不充分,因此只需要显式类型规范.