我正在嘗試使用lambda發現趣味。我創建了一個函數,它允許lambda的組成。但是,構圖的手段只允許線性轉換,並且不允許分支。從其他lambda發佈lambdas時分支
這個想法是,我知道我將在未來有一個有效的不可變狀態數據結構。我想編寫一個將從狀態中提取值的轉換;並將執行一系列可能或可能不需要該狀態的步驟來執行變換。
爲此,我創建了兩個類。功能接口的工作方式與java.util.function.Function
類似,但在andThen
方法中使用BiFunction,該方法允許將狀態參數從lambda傳遞到lambda。
import java.util.Objects;
import java.util.function.BiFunction;
@FunctionalInterface
public interface Procedure<S, T> {
T procede(S stateStructure);
default <R> Procedure<S, R> andThen(BiFunction<S, T, R> after) {
Objects.requireNonNull(after);
return (param) -> after.apply(param, procede(param));
}
}
函子是相當簡單的,具有兩個映射函數(一個其利用狀態,和一個其中沒有),以及兩個終止該完成的轉化(再次,具有和不具有狀態)的方法。
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
public class ProcedureContainer<S, T> {
protected final Procedure<S, T> procedure;
protected ProcedureContainer(final Procedure<S, T> procedure) {
this.procedure = procedure;
}
public static <S, R> ProcedureContainer<S, R> initializeContainer(
final Function<S, R> initialDataRetriever) {
return new ProcedureContainer<>(initialDataRetriever::apply);
}
public <R> ProcedureContainer<S, R> map(final BiFunction<S, T, R> mapper) {
return new ProcedureContainer<>(procedure.andThen(mapper));
}
public <R> ProcedureContainer<S, R> map(final Function<T, R> mapper) {
BiFunction<S, T, R> subMapper =
(ignored, stagedData) -> mapper.apply(stagedData);
return new ProcedureContainer<>(procedure.andThen(subMapper));
}
public Consumer<S> terminate(final BiConsumer<S, T> consumer) {
return (param) -> consumer.accept(param, procedure.procede(param));
}
public Consumer<S> terminate(final Consumer<T> consumer) {
return (param) -> consumer.accept(procedure.procede(param));
}
}
一個簡短的(人爲)例如:
StateStruct state = new StateStruct();
state.setJson("{\"data\":\"meow, meow, I'm a cow\"}");
state.setRequestedField("data");
Consumer<StateStruct> consumer = ProcedureContainer
.initializeContainer(SateStruct::getJson)
.map(JSONObject::new)
.map((state, jsonObj) -> jsonObject.getString(state.getRequsetedField()))
.terminate(System.out::singLoudly);
consumer.accept(state);
沒有人有我怎麼能實現對ProcedureContainer
一個branch
方法的任何想法,將允許最終消費者的執行條件分支。我想的東西,這將使這個例子的工作:
StateStruct state = new StateStruct();
state.setJson("{\"data\":\"meow, meow, I'm a cow\"}");
state.setRequestedField("data");
state.setDefaultMessage("There is no data... only sheep");
Consumer<StateStruct> consumer = ProcedureContainer
.initializeContainer(SateStruct::getJson)
.map(JSONObject::new)
.branch((state, jsonObj) -> !jsonObject.getString(state.getRequsetedField()))
.terminateBranch((state, json) -> System.out.lament(state.getDefaultMessage()))
.map((state, jsonObj) -> jsonObject.getString(state.getRequsetedField()))
.terminate(System.out::singLoudly);
consumer.accept(state);
我已經通過創建一個新BranchProcedureContainer
,其中有一個map
和terminateBranch
方法嘗試。這個問題是,我不知道如何合併這兩個分支的方式,只有分支得到運行。
創建新類或向現有類添加方法沒有限制。
這樣的遺憾你在這裏沒有得到任何關注。我對此也很感興趣。至少我能做的是投票。 – Eugene