基本上我想做的是遵循代碼(我將獲取系統引數并檢查它是否不為空,然后如果代碼上的當前系統不等于,則將 dbName 設定為引數)
if (Objects.nonNull(query.getSystem())) {
if (!query.getSystem().equals(dbContextHolder.getCurrentDb().toString())) {
dbContextHolder.setCurrentDb(Enum.valueOf(DbTypeEnum.class, query.getSystem()));
}
}
我還想如果 currentDb 系統為 null 然后回傳 null。我嘗試做的是
var res = Optional.ofNullable(dbContextHolder.getCurrentDb().toString())
.map(String::toString)
.filter(s -> !s.equals(dbType))
.orElse(Optional.ofNullable(dbType).orElse(null));
但正如您所見,這是錯誤的并且不起作用。如果引數 dbType 不等于 getCurrentDb 然后呼叫方法setDbType (paramDbType) 如果它們相等則回傳其中之一,如果 currentDb 為 null 然后回傳 null。
uj5u.com熱心網友回復:
通過減少您的問題,我剛剛意識到您總是希望將值query.getSystem()作為背景關系,因此:
我像這樣減少了你的代碼:
MockDbTypeEnum newMethod(MockQuery query, MockDbContextHolder dbContextHolder) {
return Optional
.ofNullable(query.getSystem())
.map(MockDbTypeEnum::valueOf)
.orElse(null);
}
MockDbTypeEnum oldMethod(MockQuery query, MockDbContextHolder dbContextHolder) {
if (Objects.nonNull(query.getSystem())) {
if (!query.getSystem().equals(dbContextHolder.getCurrentDb().toString())) {
dbContextHolder.setCurrentDb(Enum.valueOf(MockDbTypeEnum.class, query.getSystem()));
}
return dbContextHolder.getCurrentDb();
}
return null;
}
這里還有我用來證明這些方法在功能上與您的目的相同的模擬和測驗:
@ParameterizedTest
@CsvSource(value = {
"PSQL, PSQL, PSQL",
"PSQL, SQL, PSQL",
"SQL, SQL, SQL",
"SQL, PSQL, SQL",
"null, SQL, null",
"null, PSQL, null"
}, nullValues = {"null"})
void test(String system, MockDbTypeEnum currentDb, MockDbTypeEnum expectedResult) {
MockQuery query = new MockQuery(system);
MockDbContextHolder dbContextHolder = new MockDbContextHolder(currentDb);
MockDbTypeEnum result = oldMethod(query, dbContextHolder);
assertEquals(expectedResult, result);
MockDbTypeEnum newResult = newMethod(query, dbContextHolder);
assertEquals(expectedResult, newResult);
}
enum MockDbTypeEnum {
PSQL,
SQL
}
static class MockQuery {
private final String system;
public MockQuery(String system) {
this.system = system;
}
public String getSystem() {
return system;
}
}
static class MockDbContextHolder {
private MockDbTypeEnum currentDb;
public MockDbContextHolder(MockDbTypeEnum currentDb) {
this.currentDb = currentDb;
}
public MockDbTypeEnum getCurrentDb() {
return currentDb;
}
public void setCurrentDb(MockDbTypeEnum currentDb) {
this.currentDb = currentDb;
}
}
結果如下:

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/415647.html
標籤:
