Skip to content

Instantly share code, notes, and snippets.

@samuelmale
Created February 27, 2020 20:52
Show Gist options
  • Save samuelmale/818345e8a48b1a12ea900a097debb742 to your computer and use it in GitHub Desktop.
Save samuelmale/818345e8a48b1a12ea900a097debb742 to your computer and use it in GitHub Desktop.
public void shortListProgramsAndWorkflows(List<Program> programs, List<ProgramWorkflow> workflows) {
Predicate<Entry<ProgramWorkflow, Program>> predicate = entry -> {
return entry.getValue().getAllWorkflows().contains(entry.getKey());
};
filter(programs, workflows, predicate);
}
public void shortListWorkflowsAndStates(List<ProgramWorkflow> workflows, List<ProgramWorkflowState> states) {
Predicate<Entry<ProgramWorkflowState, ProgramWorkflow>> predicate = entry -> {
return entry.getValue().getStates(false).contains(entry.getKey());
};
filter(workflows, states, predicate);
}
public void shortListProgramsAndStates(List<Program> programs, List<ProgramWorkflowState> states) {
Predicate<Entry<ProgramWorkflowState, Program>> predicate = entry -> {
for (ProgramWorkflow workflow : entry.getValue().getAllWorkflows()) {
if (workflow.getStates(false).contains(entry.getKey())) {
return true;
}
}
return false;
};
filter(programs, states, predicate);
}
private <Owner, Owned> void filter(List<Owner> owningTypes, List<Owned> ownedTypes, Predicate<Entry<Owned, Owner>> predicate) {
List<Entry<Owned, Owner>> ownedToOwnersMap = new ArrayList<>();
List<Owner> ownersFiltrate = new ArrayList<>();
List<Owned> ownedMembersFiltrate = new ArrayList<>();
Function<Owner, List<Entry<Owned, Owner>>> ownersToOwnedMapper = owner -> {
HashMap<Owned, Owner> map = new HashMap<>();
for (Owned ownedType : ownedTypes) {
map.put(ownedType, owner);
}
return new ArrayList<>(map.entrySet());
};
Consumer<Entry<Owned, Owner>> updateFiltrates = entry -> {
ownedMembersFiltrate.add(((Entry<Owned, Owner>)entry).getKey());
ownersFiltrate.add(((Entry<Owned, Owner>)entry).getValue());
};
owningTypes.stream().map(ownersToOwnedMapper).forEach(item -> ownedToOwnersMap.addAll(item));
ownedToOwnersMap.stream().filter(predicate).forEach(updateFiltrates);
// update the shortlists
owningTypes.retainAll(ownersFiltrate);
ownedTypes.retainAll(ownedMembersFiltrate);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment