简化 hashmap 值的循环

Simplifying loops over hashmap values

我有以下代码:

public void setSHAShortSha() {
        if (parentTracked == null) {
            String s = "";
            for (Blob b : blobHashMap.values()) {
                s += b.toString();
            }
            sha = Utils.sha1(logMessage + dateFormatted + s);
        } else {
            String s = "";
            for (Blob b : blobHashMap.values()) {
                s += b.toString();
            }
            for (Blob b : parentTracked.values()) {
                s += b.toString();
            }
            sha = Utils.sha1(logMessage + dateFormatted + s);
        }
        shortSha = MyUtils.getShortSha(sha);
    }

这看起来很复杂。 java有没有更简单的写法?
 boolean found = false;
        for (Commit commit : commits.values()) {
            if (commit.getLogMessage().compareTo(commitMessageToSearch) == 0) {
                System.out.println(commit.getSha());
                found = true;
            }
        }
        if (!found) {
            System.out.println("aksdhlkasj");
        }

在同一行中再添加一个代码。我对不同形式的 for 循环有点陌生,流需要转换它们的帮助

你至少可以避免重复。

public void setSHAShortSha() {
    String s = "";
    for (Blob b : blobHashMap.values()) {
        s += b.toString();
    }
    if (parentTracked != null) {
        for (Blob b : parentTracked.values()) {
            s += b.toString();
        }
    }
    sha = Utils.sha1(logMessage + dateFormatted + s);
    shortSha = MyUtils.getShortSha(sha);
}

您可以将所有值与流连接:

s += blobHashMap.values().stream().map(Object::toString).collect(Collectors.joining());

你可以使用Map的forEach方法,像这样:

StringBuilder stringBuilder = new StringBuilder();
    blobHashMap.forEach((key, blob) -> {
        stringBuilder.append(blob.toString());
    });
    if (parentTracked != null) {
        parentTracked.forEach((key, blob) -> {
            stringBuilder.append(blob.toString());
        });
    }
    sha = Utils.sha1(logMessage + dateFormatted + stringBuilder.toString());
    shortSha = MyUtils.getShortSha(sha);
}