你只能用接口和lambda表達式解決所有問題。這看起來像一個簡單的任務具有這樣的模式和普通類:
public final class Stage<T,R> {
static final Runnable NO_OP =() -> {};
public static <I,O> Stage<I,O> create(Function<I,O> f) {
return new Stage<>(f, NO_OP);
}
public static <I,O> Stage<I,O> create(Function<I,O> f, Runnable cleanup) {
return new Stage<>(f, cleanup);
}
private final Function<T,R> actualAction;
private final Runnable cleanup;
private Stage(Function<T,R> f, Runnable r) {
actualAction=f;
cleanup=r;
}
public <P> Stage<T,P> nextStage(Function<R,P> nextStage) {
return new Stage<>(actualAction.andThen(nextStage), cleanup);
}
public <P> Stage<T,P> nextStage(Function<R,P> nextStage, Runnable nextCleanup) {
return new Stage<>(actualAction.andThen(nextStage),
cleanup==NO_OP? nextCleanup:() -> { cleanup.run(); nextCleanup.run(); });
}
public R process(T t) {
return actualAction.apply(t);
}
public Function<T, R> getActualAction() {
return actualAction;
}
public void cleanup() {
cleanup.run();
}
public Runnable getCleanup() {
return cleanup;
}
}
的Stage
類是簡單而不變的,但它的實際行爲是由可通過lambda表達式創建的Function
和Runnable
情況確定, 如果你希望。您可以使用純函數或通過提供函數和清理操作來創建和鏈接。你會得到兩個不同的函數和清理操作鏈,因此可以獨立執行它們。
也許你解決不了lambda表達式的一切。順便說一下,您的'Stage'與現有的'Function '接口沒有什麼不同...... –
Holger
IntermediateStage可以使用Function.andThen()' –
來模擬IT不能,因爲andThen需要與功能。但在我的情況下,我需要函數和函數 –