我的数据存储在Cosmos中,并且是分层的,并存储在不同的表中。
Hiearchy of Data
OnBoardingDefinition -> List<FeatureOrder>
FeatureStepMappingDefinition -> List<Steps>
OnBoardingStepDefinition -> Step details
当我呼叫宇宙时,我得到Flux>,Flux>和Flux>。我需要构造一个完整的OnBoarding对象,其中将包含Ids的所有详细信息。
Optional<Flux<OnBoardingDefinition>> onBoardingDefinitionFlux = cosmosRepository.getcosmosDocuments(---);
Optional<Flux<FeatureStepMappingDefinition>> featureStepMappingDefinitionFlux = cosmosRepository.getcosmosDocuments(---);
Optional<Flux<OnBoardingStepDefinition>> onBoardingStepDefinitionFlux = cosmosRepository.getcosmosDocuments(----);
Flux<Flux<Mono<StepResponseDto>>> flux3 = onBoardingDefinitionFlux.get()
.map(onBoardingDefinition -> onBoardingDefinition.getFeatureOrder())
.flatMap(Flux::fromIterable)
.filter(featureOrder -> features.contains(featureOrder.getFeatureCode()) && Objects.nonNull(featureOrder.getRequired()) && featureOrder.getRequired())
.map(featureOrder ->
{
return getFromFeature(featureStepMappingDefinitionFlux,onBoardingStepDefinitionFlux,featureOrder);
}
);
private Flux<Mono<StepResponseDto>> getFromFeature(Optional<Flux<FeatureStepMappingDefinition>> featureStepMappingDefinitionFlux,Optional<Flux<OnBoardingStepDefinition>> onBoardingStepDefinitionFlux,FeatureOrder featureOrder) {
Flux<Mono<StepResponseDto>> flux1 = featureStepMappingDefinitionFlux.get()
.filter(featureStepMappingDefinition -> featureStepMappingDefinition.getFeatureCode().equalsIgnoreCase(featureOrder.getFeatureCode()))
.map(featureStepMappingDefinition -> featureStepMappingDefinition.getSteps())
.flatMap(Flux::fromIterable)
.map(step ->
{
return getStepResponseDtoMono(onBoardingStepDefinitionFlux,step);
}
);
return flux1;
}
private Mono<StepResponseDto> getStepResponseDtoMono(Optional<Flux<OnBoardingStepDefinition>> onBoardingStepDefinitionFlux,Step step) {
Mono<StepResponseDto> flux2 = onBoardingStepDefinitionFlux.get()
.filter(onBoardingStepDefinition -> Objects.nonNull(onBoardingStepDefinition.getactive()) && onBoardingStepDefinition.getactive() && onBoardingStepDefinition.getStepCode().equalsIgnoreCase(step.getStepCode()))
.map(onBoardingStepDef -> getStepResponseDto(onBoardingStepDef)).next();
return flux2;
}
我需要简化上述过程,以免嵌套Flux和Monos。我尝试了多种方法,但是它们没有用。我已经创建了期望使用Flux的示例代码和输出。我已经使用Java 8创建了与Flux相同的结果。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
import reactor.core.publisher.Flux;
//Sample code
public class MRE {
public static class Step {
private String stepCode;
private Boolean active;
private String name;
public Step(String stepCode,Boolean active,String name) {
this.stepCode = stepCode;
this.active = active;
this.name = name;
}
public Boolean getactive() {
return active;
}
public void setactive(Boolean active) {
this.active = active;
}
public String getStepCode() {
return stepCode;
}
public void setStepCode(String stepCode) {
this.stepCode = stepCode;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Step{" +
"stepCode='" + stepCode + '\'' +
",active=" + active +
",name='" + name + '\'' +
'}';
}
}
public static class Steps {
private String stepCode;
public Steps(String stepCode) {
this.stepCode = stepCode;
}
public String getStepCode() {
return stepCode;
}
public void setStepCode(String stepCode) {
this.stepCode = stepCode;
}
@Override
public String toString() {
return "Steps{" +
"stepCode='" + stepCode + '\'' +
'}';
}
}
public static class FeatureStepMapping {
public FeatureStepMapping(String featureCode,List<Steps> steps) {
this.featureCode = featureCode;
this.steps = steps;
}
private String featureCode;
private List<Steps> steps = new ArrayList<>();
public String getFeatureCode() {
return featureCode;
}
public void setfeatureCode(String featureCode) {
this.featureCode = featureCode;
}
public List<Steps> getSteps() {
return steps;
}
public void setSteps(List<Steps> steps) {
this.steps = steps;
}
@Override
public String toString() {
return "FeatureStepMapping{" +
"featureCode='" + featureCode + '\'' +
",steps=" + steps +
'}';
}
}
public static class StepResponse {
private String stepCode;
private String name;
public StepResponse(String stepCode,String name) {
this.stepCode = stepCode;
this.name = name;
}
public String getStepCode() {
return stepCode;
}
public void setStepCode(String stepCode) {
this.stepCode = stepCode;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "StepResponse{" +
"stepCode='" + stepCode + '\'' +
",name='" + name + '\'' +
'}';
}
}
public static class OnBoarding {
private List<String> featureCodes = new ArrayList<>();
public OnBoarding(List<String> featureCodes) {
this.featureCodes = featureCodes;
}
public List<String> getFeatureCodes() {
return featureCodes;
}
public void setfeatureCodes(List<String> featureCodes) {
this.featureCodes = featureCodes;
}
@Override
public String toString() {
return "OnBoarding{" +
"featureCodes=" + featureCodes +
'}';
}
}
public static class OnBoardingResponse {
private String id;
private List<StepResponse> stepResponses = new ArrayList<>();
public OnBoardingResponse(String id,List<StepResponse> stepResponses) {
this.id = id;
this.stepResponses = stepResponses;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public List<StepResponse> getStepResponses() {
return stepResponses;
}
public void setStepResponses(List<StepResponse> stepResponses) {
this.stepResponses = stepResponses;
}
@Override
public String toString() {
return "OnBoardingResponse{" +
"id='" + id + '\'' +
",stepResponses=" + stepResponses +
'}';
}
}
public static void main(String[] args) {
Step step1 = new Step("S1",true,"Step1");
Step step2 = new Step("S2","Step2");
Step step3 = new Step("S3","Step3");
List<Step> stepList = Arrays.asList(step1,step2,step3);
Flux<List<Step>> stepFlux = Flux.just(stepList);
FeatureStepMapping featureStepMapping1 = new FeatureStepMapping("f1",new ArrayList<>());
featureStepMapping1.getSteps().add(new Steps("S1"));
featureStepMapping1.getSteps().add(new Steps("S2"));
FeatureStepMapping featureStepMapping2 = new FeatureStepMapping("f2",new ArrayList<>());
featureStepMapping1.getSteps().add(new Steps("S3"));
List<FeatureStepMapping> featureStepMappingList = Arrays.asList(featureStepMapping1,featureStepMapping2);
Flux<List<FeatureStepMapping>> stepFeature = Flux.just(featureStepMappingList);
List<OnBoarding> onBoardingList = Arrays.asList(new OnBoarding(Arrays.asList("f1","f2")));
Flux<List<OnBoarding>> onBoardingFlux = Flux.just(onBoardingList);
// Get Mono<OnBoardingResponse> Don't change Flux<List<>> assume this is I get from database directly.
//With Plain Java8
List<StepResponse> stepResponses = onBoardingList.stream().flatMap(onBoarding -> onBoarding.getFeatureCodes().stream())
.map(feature ->
featureStepMappingList.stream()
.filter(featureStep -> featureStep.getFeatureCode().equalsIgnoreCase(feature))
.map(obj -> obj.getSteps()).flatMap(step -> step.stream()).collect(Collectors.toList())
).flatMap(obj -> obj.stream())
.map(step -> stepList.stream().filter(definedStep -> definedStep.getStepCode().equalsIgnoreCase(step.getStepCode())).collect(Collectors.toList()))
.flatMap(step -> step.stream()).map(step -> new StepResponse(step.getStepCode(),step.getName())).collect(Collectors.toList());
OnBoardingResponse onBoardingResponse = new OnBoardingResponse(UUID.randomUUID().toString(),stepResponses);
System.out.println(onBoardingResponse);
}
}
//Output
OnBoardingResponse{id='77b647c5-84ae-4fde-8039-ea5deed1a2bd',stepResponses=[StepResponse{stepCode='S1',name='Step1'},StepResponse{stepCode='S2',name='Step2'},StepResponse{stepCode='S3',name='Step3'}]}