質問
私は(あなたがステップ関数を呼び出すとき、次の項目にのみ計算されることを意味する)怠惰なシーケンスを実装しようとしている、そしてそれが持つべき方法の一つは、すべてのメンバーに影響を及ぼし機能を受け取り、「マップ」であります。これを行うための最もエレガントな方法は、利用機能組成物であり、関数の変数に新しい機能を割り当てますが、機能はJavaでファーストクラスの値ではありませんので、私はどのようにこれを行うには考えています。
私は唯一の「機能ポインタ」ラッパーの一種として、機能が含まれていることをクラスを持っていることについて考えたが、私はそれが組成物に使用することができる方法を見ていません。
編集:質問は宿題関連です。 また、それは(メソッド「マップ」を介して所定の関数である。この場合の「マップ」)地図(マップ(マップ(stepFunction())))のラインに沿って複数の組成物を処理することができる必要があります。
解決
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());
}
}
他のヒント
はるかFunction
タイプ、Functions.compose(Function, Function)
方法、Iterables.transform(Iterable, Function)
方法、およびを持ってのGoogleのコレクション。
あなたに役に立たなかった、これは宿題のためであれば(私は本当に自分の質問が宿題に関連しているとき、誰もが開示してほしい)。
Javaでは、あなたは常にクラスのプロトコルでこれを行います。 java.lang.Thread
と標準的な例の実行機能を参照してください。 Javaで「関数ポインタ」または「機能変数」にはありません。
FWIWは、Javaで "関数ポインタ" と等価であるのインターフェースの単一のメソッドを持ちます。あなたは、メソッドの実装を提供するいくつかのクラスとインタフェースを実装し、そのクラスのオブジェクトへの参照を格納します。
異なる方法を実装する別のクラスのオブジェクトへの参照を変更し、異なる機能にポイントへの関数ポインタを変更することと等価である。
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);
}
}
呼び出しが(リスト、新しいは、DisplayFunctionを())を適用;