首页 > 解决方案 > 性能与稍微干净的代码:在循环之前和循环期间检查属性

问题描述

我正在对现有代码添加一些更改,并注意到可以通过事先检查条件来优化它,但是这样做确实会使代码变得干净。

原始代码是这样的:

private void changeProperties(String a, String b, Document doc) {
    if(!isEmptyOrNull(a)) {
        doc.setA(a);
    }
    if(!isEmptyOrNull(b)){
        doc.setB(b);
    }
    saveDocument(doc);
}

然后我添加了一个方法,只需接收一个列表并调用上述方法,就像这样

private void updatePropertiesForDocuments(List<Document> docs, String a, String b) {
    docs.forEach(doc -> changeProperties(a, b, doc));
}

然后我意识到,在新功能中,每个文档的属性“a”和“b”将始终相同。有了这些信息,我认为检查每个文档的“a”和“b”是否为空或为空是毫无意义的(尤其是如果列表可能非常大,例如 100,000+)。

因此,我认为在进入循环之前进行空检查是一个更好的主意,如下所示:

private void updatePropertiesForDocuments(List<Document> docs, String a, String b) {
    boolean isAMissing = isEmptyOrNull(a);
    boolean isBMissing = isEmptyOrNull(b);

    if(!isAMissing && !isBMissing) {
        docs.forEach(doc -> {
            doc.setA(a);
            doc.setB(b);
            saveDocument(doc);
        });
    } else if(!isBMissing) {
        docs.forEach(doc -> {
            doc.setB(b);
            saveDocument(doc);
        });
    } else if(!isAMissing) {
        docs.forEach(doc -> {
            doc.setA(a);
            saveDocument(doc);
        });
    }
}

我想知道,如果文档的大小很大(100,000+),性能是否会有明显差异,或者 JVM 是否进行了一些“幕后”优化,这会使进行此更改毫无意义?

标签: java

解决方案


推荐阅读