5

私は遅延シーケンスを実装しようとしています (つまり、次の項目はステップ関数を呼び出したときにのみ計算されます)。それが持つべきメソッドの 1 つは、mapすべてのメンバーに影響を与える関数を受け取る " " です。
これを行う最もエレガントな方法は、関数合成を使用して新しい関数を関数変数に割り当てることですが、Java では関数はファースト クラスの値ではないため、これを行う方法がわかりません。

一種の「関数ポインタ」ラッパーとして、関数のみを含むクラスを持つことを考えましたが、それを構成に使用する方法がわかりません。

編集:質問は宿題に関連しています。また、 (" " この場合はメソッド "map" で指定された関数)
の行に沿って複数の構成を処理できる必要があります。map(map(map(stepFunction())))map

4

6 に答える 6

6

Java とその苦痛へようこそ。

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());
    }
}
于 2009-11-19T21:03:08.583 に答える
5

Google Collectionsには、Functionタイプ、Functions.compose(Function, Function)メソッド、Iterables.transform(Iterable, Function)メソッドなどがあります。

これが宿題の場合は役に立ちません(質問が宿題に関連する場合は、全員が明らかにしてほしいと思います).

于 2009-11-19T21:18:11.363 に答える
1

Java では、常にクラス プロトコルを使用してこれを行います。java.lang.Thread標準的な例については、 および run 関数を参照してください。Java には「関数ポインタ」または「関数変数」はありません。

于 2009-11-19T20:59:00.153 に答える
0

FWIW、Javaで同等の「関数ポインタ」は、単一のメソッドを持つインターフェースです。メソッドの実装を提供するクラスを使用してインターフェイスを実装し、そのクラスオブジェクトへの参照を格納します。

メソッドを別の方法で実装する別のクラスオブジェクトへの参照を変更することは、別の関数を指すように関数ポインターを変更することと同じです。

于 2009-11-19T21:38:59.290 に答える
-1
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);
    }
}

呼び出し apply(list, new DisplayFunction());

于 2009-11-19T21:01:24.250 に答える