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

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

在 Java 中使用 Optional 和 lambdas

在 Java 中使用 Optional 和 lambdas

慕尼黑8549860 2022-06-15 15:43:41
我正在使用 Java 中的 Optional 和 lambdas 編寫代碼,并且想知道在以下情況下最好的方法是什么:public Optional<BObject> readIndexMaybe(String ref) {    try {        return Optional.ofNullable(index.read(ref)).map(BObjectBuilder::build);    } catch (IOException e) {        LOGGER.error(String.format("Could not read index of ref: %s, error: %s", ref, e));    }    return Optional.empty();}public Optional<BObject> readMaybe(String ref) {    Optional<BObject> bObject = readIndexMaybe(ref);    return bObject.flatMap(boMaybe -> {                <---- HERE        try {            LOGGER.debug(String.format("Object read: %s", ref));            BObject obj = new BObjectBuilder(boMaybe).stream(loadDocumentStream(boMaybe)).build();            return Optional.of(obj);        } catch (IOException e) {            LOGGER.error(String.format("Could not read file with ref: %s, error: %s", ref, e));        }        return Optional.empty();    });}Optional<BObject>使用返回 an然后使用它作為返回類型flatMap接收的 lambda 函數會更好,還是在 lambda 內部返回然后只使用會更好:Optional<BObject>nullmappublic Optional<BObject> readIndexMaybe(String ref) {   try {       return Optional.ofNullable(index.read(ref)).map(BObjectBuilder::build);   } catch (IOException e) {       LOGGER.error(String.format("Could not read index of ref: %s, error: %s", ref, e));   }   return Optional.empty();}public Optional<BObject> readMaybe(String ref) {   Optional<BObject> bObject = readIndexMaybe(ref);   return bObject.map(boMaybe -> {              <--- HERE       try {           LOGGER.debug(String.format("Object read: %s", ref));           return new BObjectBuilder(boMaybe).stream(loadDocumentStream(boMaybe)).build();       } catch (IOException e) {           LOGGER.error(String.format("Could not read file with ref: %s, error: %s", ref, e));       }       return null;   });}第一種方法對我來說似乎稍微好一點,因為我可能會在其他地方重用 lambda 函數,但它不會返回null但是Optional. 但是,只要我只在一個地方使用它就值得嗎?
查看完整描述

2 回答

?
UYOU

TA貢獻1878條經驗 獲得超4個贊

如果您有選擇,我建議編寫返回Optional而不是 null 的函數,如果無結果是正常且預期的結果。因此,您將使用flatMap調用此類函數。該map操作對于始終返回有效結果的函數很有用。它還將 null 返回轉換為 empty Optional,這主要在您需要適應無法更改的返回 null 的代碼時有用。


通常的建議是提取方法而不是使用多行語句 lambda。然后,在操作中使用簡單的 lambda 或方法引用flatMap。


此外,對于 try/catch 塊,我建議將 try 子句中的代碼最小化為僅可以實際拋出您正在捕獲的異常的代碼,并在 try 語句之外進行其他轉換。在這種情況下,我假設index.read(ref)andloadDocumentStream(boMaybe)是可以拋出的語句IOException。請注意,這意味著局部變量需要保存臨時結果,并且它可以為空。我認為這沒關系。null 處理非常本地化,它允許您將返回的創建合并Optional到單個表達式中。


最后,我建議不要對可選項使用后綴“也許”。這令人困惑,并且在示例boMaybe中flatMap操作的 lambda 參數不正確。僅當值存在時才評估該 lambda,因此沒有“可能”。


應用所有這些建議給出了結果代碼:


Optional<BObject> readIndex(String ref) {

    Index i = null;

    try {

        i = index.read(ref);

    } catch (IOException e) {

        LOGGER.error(/*...*/);

    }

    return Optional.ofNullable(i).map(BObjectBuilder::build);

}


Optional<BObject> load(BObject bo) {

    DocStream docStream = null;

    try {

        LOGGER.debug(/*...*/);

        docStream = loadDocumentStream(bo);

    } catch (IOException e) {

        LOGGER.error(/*...*/);

    }

    return Optional.ofNullable(docStream)

                   .map(ds -> new BObjectBuilder(bo).stream(ds).build());

}


Optional<BObject> read(String ref) {

    return readIndex(ref).flatMap(bo -> load(bo)); // or this::load

}


查看完整回答
反對 回復 2022-06-15
?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

您可能希望提供一個穩定且安全的 api,這就是您使用 的原因Optional,盡管在您的情況下它會使事情變得有點復雜,因為您需要捕獲已檢查的異常。我建議這種方法:


public Optional<BObject> readIndexMaybe(String ref) {

   try {

       return Optional.ofNullable(index.read(ref)).map(BObjectBuilder::build);

   } catch (IOException e) {

       LOGGER.error(String.format("Could not read index of ref: %s, error: %s", ref, e));

   }

   return Optional.empty();

}


public Optional<BObject> readMaybe(String ref) {

   Optional<BObject> bObject = readIndexMaybe(ref);

   if(!bObject.isPresent()){

      return bObject; // is same as Optional.empty()

   }

   BObject boMaybe = bObject.get();

   try {

      LOGGER.debug(String.format("Object read: %s", ref));

      boMaybe = new BObjectBuilder(boMaybe).stream(loadDocumentStream(boMaybe)).build();

      return Optional.of(boMaybe);

   } catch (IOException e) {

      LOGGER.error(String.format("Could not read file with ref: %s, error: %s", ref, e));

      return Optional.empty();

   }

}

這與您的地圖方法非常相似,但我認為它更清楚,因為您沒有try-catch內部 lambda。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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