Не использовать Map
. Это не даст вам такой же безопасности во время компиляции, как ваша switch
.
Если вы все еще хотите от нее избавиться, то я бы предложил использовать 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;
}
}
Затем используйте его следующим образом:
String createdData = DataCreationStrategy.of(key, versionFlag).apply(creator);
(Вы можете заменить String
на фактический тип данных, который вам нужно сгенерировать)
Можно реализовать метод of
в моде Stream API также. Но обычный старый цикл for в этом конкретном случае намного чище.
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);
}