如何使用Java 7计算嵌套列表元素的大小?

时间:2018-09-24 15:22:10

标签: java for-loop arraylist java-7

我有一个对象,其中包含另一个对象的列表,该对象包含另一个对象的列表,依此类推...假设我想获取嵌套列表元素的数量(让我们说最后一个),应该是最好的方法,而不是就像在下面的示例中一样,在Java中使用传统的for循环-

public static void main(String[] args) {

    Statement statement = new Statement();
    statement.getInvAccount().add(new InvestmentAccount());
    statement.getInvAccount().get(0).getSecAccountStmt().add(new SecurityStatement());
    statement.getInvAccount().get(0).getSecAccountStmt().get(0).getTransactionStatement().add(new TransactionStatement());
    statement.getInvAccount().get(0).getSecAccountStmt().get(0).getTransactionStatement().add(new TransactionStatement());
    statement.getInvAccount().get(0).getSecAccountStmt().get(0).getTransactionStatement().add(new TransactionStatement());

    // method to count the number of TransactionStatement
    System.out.println("Size of TransactionStatement is : " + count(statement));

}

private static int count(Statement stmt) {
    int countOfTransStmt = 0;
    for (InvestmentAccount invAcc : stmt.getInvAccount()) {
        if (invAcc != null) {
            for (SecurityStatement secStmt : invAcc.getSecAccountStmt()) {
                if (secStmt != null) {
                    countOfTransStmt = countOfTransStmt + secStmt.getTransactionStatement().size();
                }
            }
        }
    }
    return countOfTransStmt;
}

2 个答案:

答案 0 :(得分:2)

在Java 7中,您做不到两个for循环。我不会打扰任何其他事情。

在Java 8中,您可以使用流将其扁平化:

private static int count(Statement stmt) {
    return stmt.getInvAccount().stream()
        .filter(Objects::nonNull)
        .flatMap(InvestmentAccount::getSecAccountStmt)
        .filter(Objects::nonNull)
        .flatMap(SecurityStatement::getTransactionStatement)
        .count();
}

我鼓励您摆脱空检查。如果您要忽略空值,最好只是不要将它们放在首位。我希望它会消除整个代码中许多额外的if检查。

我也鼓励您不要缩写变量和方法。阐明“声明”和“投资”等。缩写词更难读,简洁不是赢家。

同样,尝试使用更多描述性的方法名称。 countTransactions适用于主要方法。对于各种获取器,返回列表的方法应该是复数形式:“ getAccounts”而不是“ getAccount”。注意,getter现在如何与类名匹配;如果知道类名,就知道吸气剂名称。您不必猜测一个或另一个是否被缩写:

private static int countTransactions(Statement statement) {
    return statement.getInvestmentAccounts().stream()
        .flatMap(InvestmentAccount::getSecurityStatements)
        .flatMap(SecurityStatement::getTransactionStatements)
        .count();
}

答案 1 :(得分:-1)

在这种情况下,递归可以工作: 总体思路如下:

 private int countTransactions(object t)
{
int sum = 0;
if (t == null) return 0;
for (int i = 0; i < t.getAllSub().count; i++)
{
    sum += countTransactions(t.subAt(i));
}

 return sum;
}