Pregunta Función de permutación de puerto Erlang a Java 8 con expresiones lambda y flujos


¿Es posible escribir el siguiente código de Erlang solo con expresiones lambda de Java 8 y flujos de Java 8? Esto es de Lista de comprensiones 3.3 Permutaciones

perms([]) -> [[]];
perms(L)  -> [[H|T] || H <- L, T <- perms(L--[H])].

5
2017-08-12 07:41


origen


Respuestas:


Uso de una operación ternaria para reemplazar la coincidencia de patrones, flatMap para reemplazar múltiples generadores y métodos estáticos para implementar | y - operaciones:

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));
    }
}

La especificación de tipo explícita en .<List<E>> flatMap( solo es necesario debido a una inferencia de tipo inadecuada del compilador de Java.


7
2017-08-12 22:57