繁体   English   中英

如何使用 Java stream map 与过滤器和可选?

[英]How to use Java stream map with filters and optional?

基本上我想做的是遵循代码(我将获取系统参数并检查它是否不是 null 然后如果代码上的当前系统不等于然后将 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 ,我该如何实现。

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

}

结果如下: 在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM