2 回答
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
}
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。
添加回答
舉報
