Tôi đang thử nghiệm với lambdas để giải trí. Tôi tạo ra một functor cho phép các thành phần của một lambda. Tuy nhiên, các phương tiện của chế phẩm chỉ cho phép chuyển đổi tuyến tính và không cho phép phân nhánh.Phân nhánh khi soạn lambdas từ các lambdas khác
Ý tưởng là tôi biết tôi sẽ có, trong tương lai, một cấu trúc dữ liệu trạng thái bất biến có hiệu quả. Tôi muốn soạn một biến đổi sẽ trích xuất một giá trị từ trạng thái; và sẽ thực hiện một loạt các bước, có thể hoặc không yêu cầu nhà nước, để thực hiện chuyển đổi.
Để kết thúc này, tôi tạo hai lớp. Giao diện chức năng hoạt động như java.util.function.Function
, nhưng có một hàm sinh học theo phương pháp andThen
, cho phép tham số trạng thái được truyền từ lambda sang 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));
}
}
Các functor là khá đơn giản, có hai chức năng lập bản đồ (một trong đó sử dụng nhà nước, và một trong đó không), và hai chấm dứt phương pháp hoàn thiện biến đổi (một lần nữa, có và không có nhà nước).
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));
}
}
Sơ lược (giả tạo) ví dụ:
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);
Có ai có bất kỳ ý tưởng như thế nào tôi có thể thực hiện một phương pháp branch
trên ProcedureContainer
mà sẽ cho phép một chi nhánh có điều kiện trong việc thực hiện của người tiêu dùng chính thức . Tôi đang nghĩ đến một cái gì đó mà có thể làm việc ví dụ này:
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);
tôi đã cố gắng bằng cách tạo ra một mới BranchProcedureContainer
, trong đó có một phương pháp map
và terminateBranch
. Vấn đề này là tôi không biết làm thế nào để hợp nhất hai nhánh theo cách mà chỉ có nhánh mới được chạy.
Không có hạn chế về việc tạo lớp mới hoặc thêm phương thức vào lớp hiện có.
tiếc là bạn không nhận được bất kỳ sự chú ý nào ở đây. Tôi cũng rất thích điều này. Ít nhất tôi có thể làm là bỏ phiếu. – Eugene