Do not use Map
. It will not give you the same compile time safety as your switch
does.
If you still want to get rid of it, then I would suggest using enum
:
public enum DataCreationStrategy {
ONE("one", DataCreator::createDataOneV1, DataCreator::createDataOneV2),
TWO("two", DataCreator::createDataTwoV1, DataCreator::createDataTwoV2)
// ... other cases
;
private final String key;
private final Function<DataCreator, String> creator;
private final Function<DataCreator, String> defaultCreator;
DataCreationStrategy(String key, Function<DataCreator, String> creator, Function<DataCreator, String> defaultCreator) {
this.key = key;
this.creator = creator;
this.defaultCreator = defaultCreator;
}
public static Function<DataCreator, String> of(String key, boolean flag) {
for (DataCreationStrategy strategy: values()){
if(strategy.key.equals(key)){
return flag ? strategy.creator : strategy.defaultCreator;
}
}
return DataCreator::createDefaultData;
}
}
Then use it like this:
String createdData = DataCreationStrategy.of(key, versionFlag).apply(creator);
(You can replace String
to the actual data type you need to generate)
The of
method could be implemented in Stream API fashion also. But plain old for-loop is much cleaner in this particular case.
public static Function<DataCreator, String> of(String key, boolean flag) {
return Arrays.stream(values())
.filter(s -> s.key.equals(key))
.findAny()
.map(s -> flag ? flag ? s.creator : s.defaultCreator )
.orElse(DataCreator::createDefaultData);
}