如何使用带过滤器和可选的 Java 流图?

How to use Java stream map with filters and optional?

基本上我想做的是遵循代码(我将获取系统参数并检查它是否不为空然后如果代码上的当前系统不等于那个然后将 dbName 设置为参数)

if (Objects.nonNull(query.getSystem())) {
            if (!query.getSystem().equals(dbContextHolder.getCurrentDb().toString())) {
                dbContextHolder.setCurrentDb(Enum.valueOf(DbTypeEnum.class, query.getSystem()));
            }
        }

我还想如果 currentDb 系统为空则 return 为空。我尝试做的是

var res = Optional.ofNullable(dbContextHolder.getCurrentDb().toString())
                .map(String::toString)
                .filter(s -> !s.equals(dbType))
                .orElse(Optional.ofNullable(dbType).orElse(null));

但如您所见,它是错误的,无法正常工作。我如何实现 if parameter dbType is not equal to getCurrentDb then call the method setDbType(paramDbType) if they are equal then return 其中之一 if currentDb is null then return null .

通过减少你的问题,我刚刚意识到你总是希望 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;
    }

}

结果如下: