使用lambda表达式和流将Erlang置换函数移植到Java 8

使用lambda表达式和流将Erlang置换函数移植到Java 8,java,erlang,java-8,Java,Erlang,Java 8,是否可以只使用Java8Lambda表达式和Java8Streams编写以下Erlang代码? 这是从 perms([])->[[]]; perms(L)->[[H | T]| H使用三值运算替换模式匹配,使用flatMap替换多个生成器,使用静态方法实现|和--运算: import static java.util.stream.Collectors.toList; import java.util.ArrayList; import java.util.Arrays; import java

是否可以只使用Java8Lambda表达式和Java8Streams编写以下Erlang代码? 这是从

perms([])->[[]];

perms(L)->[[H | T]| H使用三值运算替换模式匹配,使用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));
    }
}
导入静态java.util.stream.Collectors.toList;
导入java.util.ArrayList;
导入java.util.array;
导入java.util.Collections;
导入java.util.List;
公开课范例{
公共静态列表管道(E头、列表尾){
List newList=newarraylist(tail);
新增列表。添加(0,标题);
返回newList;
}
公共静态列表减法(列表列表,E){
List newList=新阵列列表(List);
删除(e);
返回newList;
}
公共静态列表perms(列表l){
返回l.isEmpty()
?Collections.singletonList(Collections.emptyList())
:l.stream().flatMap(h->perms(减去(l,h)).stream().map(t->pipe(h,t)))
.collect(toList());
}
公共静态void main(字符串[]args){
List=Arrays.asList(新字符串[]{“b”、“u”、“g”});
System.out.println(perms(list));
}
}

.flatMap(
上的显式类型规范是必要的,因为Java编译器的类型推断不充分。

我想知道您是否也可以在没有任何自定义方法的情况下编写它。如果流API有一个skip(Object元素),那就太酷了方法,如果您只想过滤一个特定的已知元素,它可能会很方便。
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));
    }
}