2 回答

TA貢獻1772條經驗 獲得超5個贊
您可以將 中使用的映射器和 中使用的使用者存儲在 .Optional::mapOptional::ifPresentMap
我還建議您創建一個方法來避免字符串替換的代碼重復,這應該很容易調用。這很有用,因為所有替換都是相同的
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);
});
如果要擴展此機制并對傳遞給 setter 的每個 String 應用不同的函數,則還需要使用不同的結構:
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);
});

TA貢獻1840條經驗 獲得超5個贊
public void foo(final MyObject bar) {
if (bar == null)
return;
Map<Supplier<String>, Consumer<String>> funcs = new HashMap<>();
funcs.put(bar::getF1, bar::setF1);
funcs.put(bar::getF2, bar::setF2);
funcs.forEach(
(getter, setter) -> Optional.of(getter.get()).ifPresent(s -> setter.accept(s.replaceAll("x", "a"))));
}
另請注意,參數處理已替換為 guard 子句:這必須在解析之前進行,以防止 NPE。它還使預期的處理更清晰。nullOptionalbar::...null
添加回答
舉報