Pergunta

Eu estou tentando implementar um preguiçoso sequência (o que significa que o item é calculado apenas quando você chamar a função step), e um dos métodos que ele deve ter é "mapa", que recebe uma função que afeta todos os membros.A forma mais elegante de fazer isso é usar a função de composição, e atribuir a nova função para a variável de função, mas desde que as funções não são valores de primeira classe em Java eu não tenho nenhuma idéia de como fazer isso.

Eu pensei sobre ter uma classe que contém apenas uma função, como uma espécie de "ponteiro de função" wrapper, mas eu não vejo como isso pode ser usado para a composição.

Editar:a pergunta é o dever de casa relacionados.Além disso, ele deve ser capaz de lidar com várias composições ao longo das linhas de mapa(map(mapa(stepFunction()))) ("mapa", neste caso, sendo a função dada por meio do método de "mapa").

Foi útil?

Solução

Bem -vindo a Java e suas dores.

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

Outras dicas

Coleções do Google tem o Function digite o Functions.compose(Function, Function) Método, o Iterables.transform(Iterable, Function) método, e muito mais.

Não é útil para você se isso for para a lição de casa (eu realmente gostaria que todos divulgassem quando a pergunta deles estiver relacionada à lição de casa).

Em Java, você sempre faz isso com uma classe de protocolo.Ver java.lang.Thread e a executar a função para o exemplo canônico.Não há nenhuma 'ponteiros de função" ou " função de variáveis em Java.

FWIW, o "ponteiro da função" equivalente em java é um interface com um único método. Você implementa a interface com alguma classe, que fornece uma implementação do método e, em seguida, armazena uma referência a esse objeto de classe.

Alterar a referência a outro objeto de classe, que implementa o método de maneira diferente, é equivalente a alterar o ponteiro da função para apontar para uma função 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);
    }
}

a chamada Aplicar (lista, new DisplayFunction ());

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top