Вы можете хранить картографы, используемые в Optional::map
, а потребители, используемые в Optional::ifPresent
, в Map
.
Я также рекомендую вам создать метод, чтобы избежать дублирования кода для замены String, который должен вызываться легко. Это полезно, так как все замены одинаковы
private String replaced(String string) {
return string.replaceAll("x", "a");
}
Затем просто переберите записи и примените каждую из пар ключ-значение (порядок не имеет значения):
Map<Function<? super MyObject, ? extends String>, Consumer<? super String>> map = new HashMap<>();
map.put(MyObject::getF1, bar::setF1);
map.put(MyObject::getF2, bar::setF2);
map.put(MyObject::getF10, bar::setF10);
// ...
map.forEach((function, consumer) -> {
Optional.of(bar).map(function).map(this::replaced).ifPresent(consumer);
});
Если вы хотите расширить этот механизм и применить разные функции к каждой строке, передаваемой установщику, вам также необходимо использовать другую структуру:
public final class Mapping {
private final Function<MyObject, String> getterFunction;
private final Function<String, String> transformationFunction;
private final Consumer<String> setterFunction;
public Mapping(final Function<MyObject, String> getterFunction, final Function<String, String> transformationFunction,
final Consumer<String> setterFunction) {
this.getterFunction = getterFunction;
this.transformationFunction = transformationFunction;
this.setterFunction = setterFunction;
}
// getters
}
И использование аналогично (функции преобразования являются примерами и могут отличаться):
List<Mapping> list = new ArrayList<>();
list.add(new Mapping(MyObject::getF1, s -> s.replaceAll("x", "a"), bar::setF1));
list.add(new Mapping(MyObject::getF2, s -> s.replaceAll("x", "a"), bar::setF2));
list.add(new Mapping(MyObject::getF10, s -> s.replaceAll("x", "a"), bar::setF10));
list.forEach(mapping -> {
Optional.of(bar)
.map(mapping.getGtterFunction)
.map(mapping.getTransformationFunction)
.ifPresent(mapping.getSetterFunction);
});