マックスZofal:
私は、コードの2つの類似の部分を持っています:
void task1() {
init();
while(someCondition) {
doSomething();
}
shutdown();
}
void task2() {
while(someCondition) {
init();
doSomething();
shutdown();
}
}
私は、コードの重複を避けたいと私は、これは機能的なアプローチを使用して行うことができると思っていました。私は別々の関数でループし、init /シャットダウン・コールを入れたい、その後、そのコール(ないJavaの8ファンクションインタフェース、より多くの擬似コード)をチェーン:
Function setup(Function f){
init();
f();
shutdown();
}
Function loop(Function f){
while(someCondition) {
f();
}
}
そして、私はこのようなチェーンにこれらをしたいです:
void task1() {
setup(loop(doSomething));
}
void task2() {
loop(setup(doSomething));
}
私は、Javaの関数インタフェースでコン/ andThenと思ったが、彼らは唯一の次の一から一関数の戻り値に渡しているため、彼らは適していません。誰もがJavaの8または異なるアプローチでこれを行う方法のアイデアを持っていますか?
スイーパー:
あなたは確かにこれを行うことができます。あなたは必要はありRunnable
ません、Function
あなたのメソッドがパラメータを受け入れないし、何も値を返さないので、。あなたの方法はしかし別の署名を持っている場合は、別のタイプを使用する必要があります。
public static void init() { ... }
public static void doSomething() { ... }
public static void shutdown() { ... }
public static Runnable setup(Runnable r) {
return () -> {
init();
r.run();
shutdown();
};
}
public static Runnable loop(Runnable r) {
return () -> {
while (someCondition) {
r.run();
}
};
}
// I used "Main" here because this in a class called Main. Replace "Main" with the name of your class
public static void task1() {
setup(loop(Main::doSomething)).run();
}
public static void task2() {
loop(setup(Main::doSomething)).run();
}
また、機能的なプログラマの目に、最初のコードは、「重複」に見えるかもしれませんが、Javaプログラマに、最初のコードは非常に細かいことがあるようであることに留意すべきです。この方法は、より機能的なスタイルに使用されていない人々に混乱するかもしれない、それを書き換えます。