亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

對多個功能執行相同的操作

對多個功能執行相同的操作

白衣染霜花 2022-09-22 10:12:38
我有一個具有多個函數的類,例如 to 。對于這些 getter,我希望將字母替換為一個(隨機示例)。獲取器可以返回空值。getgetF1getF10"x""a"到目前為止,這就是我所做的,它的工作原理,有沒有辦法得到比這更好看的東西?public void foo(final MyObject bar) {    Optional.of(bar).map(MyObject::getF1).ifPresent(s -> bar.setF1(s.replaceAll("x", "a"));    Optional.of(bar).map(MyObject::getF2).ifPresent(s -> bar.setF2(s.replaceAll("x", "a")));    ...    Optional.of(bar).map(MyObject::getF10).ifPresent(s -> bar.setF10(s.replaceAll("x", "a")));}我在想這樣的事情,使用一個列表,顯然,這個代碼是錯誤的,但你明白了:public void foo(final MyObject bar) {    List<Function> func = new ArrayList<Function>();    func.addAll(Arrays.asList(MyObject::getF1, MyObject::getF2, ..., MyObject::getF10));    Optional.of(bar).map(func).ifPresent(s -> func(s.replaceAll("x", "a"));}也許使用流可以完成工作?
查看完整描述

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);

});


查看完整回答
反對 回復 2022-09-22
?
慕斯709654

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


查看完整回答
反對 回復 2022-09-22
  • 2 回答
  • 0 關注
  • 105 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號