Pregunta

Estoy tratando de poner en práctica una secuencia perezosa (lo que significa que el siguiente punto se calcula únicamente cuando se invoca la función escalón), y uno de los métodos que debe tener es "mapa" que recibe una función que afecta a todos los miembros . La forma más elegante de hacer esto es utilizar la composición de funciones y asignar la nueva función a la variable de la función, pero ya que las funciones no son valores de primera clase en Java no tengo ni idea de cómo hacer esto.

I pensado en tener una clase que sólo contiene una función, como una especie de envoltorio "puntero de función", pero no veo la forma en que se puede utilizar para la composición.

Editar: pregunta es relacionada con la tarea. También, debe ser capaz de manejar múltiples composiciones a lo largo de las líneas de mapa (mapa (mapa (stepFunction ()))) ( "mapa" siendo en este caso la función dada a través del método "mapa").

¿Fue útil?

Solución

Bienvenido a Java y sus dolores.

interface Function<T> {
    public T eval(T argument);
}

class Lazy<T> {
    private Iterator<T> source;
    private Function<T> filter;
    Lazy(final Iterator<t> source, final Function<T> filter) {
        this.source = source;
        this.filter = filter;
    }
    public T step() {
        return filter.eval(source.next());
    }
}

Otros consejos

Google Colecciones tiene el tipo Function, el método Functions.compose(Function, Function), el método Iterables.transform(Iterable, Function), y mucho más.

No es de utilidad para usted si esto es para hacer la tarea (Realmente deseo que todo el mundo se revela cuando su pregunta es tarea relacionada).

En Java, siempre se hace esto con un protocolo de clase. Ver java.lang.Thread y la función de ejecución para el ejemplo canónico. No hay 'punteros de función' o 'variables de la función' en Java.

Fwiw, la "función de puntero" equivalente en Java es un Interfaz con un solo método. Implementa la interfaz con un poco de clase, lo que proporciona una implementación del método, y luego almacenar una referencia a ese objeto de clase.

Cambio de la referencia a otro objeto de la clase, que implementa el método de manera diferente, es equivalente a cambiar el puntero de función para señalar a una función diferente.

public static <T> void apply(final List<T> list, final Function<T> func)
{
    for(final T val : list)
    {
        func.perform(val);
    }
}

interface Function<T>
{
    void apply(T value);
}

class DisplayFunction<T>
    implements Function<T>
{
    public void perform(T value)
    {
        System.out.println(value);
    }
}

aplicar la llamada (lista, nueva DisplayFunction ());

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top