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

如何使用Java7计算嵌套列表元素的大小?,java,for-loop,arraylist,java-7,Java,For Loop,Arraylist,Java 7,我有一个对象,它包含另一个对象的列表,它包含另一个对象的列表,依此类推。。。假设我想得到嵌套列表元素的数量(比如最后一个),那么最好的方法是什么,而不是像我在下面的示例中所做的那样在java中使用传统的for循环 public static void main(String[] args) { Statement statement = new Statement(); statement.getInvAccount().add(new InvestmentAccount())

我有一个对象,它包含另一个对象的列表,它包含另一个对象的列表,依此类推。。。假设我想得到嵌套列表元素的数量(比如最后一个),那么最好的方法是什么,而不是像我在下面的示例中所做的那样在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;
}

在Java7中,对于循环,您不会比两个
做得更好。我不会为任何不同的事烦恼

在Java 8中,您可以使用streams将其展平:

private static int count(Statement stmt) {
    return stmt.getInvAccount().stream()
        .filter(Objects::nonNull)
        .flatMap(InvestmentAccount::getSecAccountStmt)
        .filter(Objects::nonNull)
        .flatMap(SecurityStatement::getTransactionStatement)
        .count();
}
我鼓励你摆脱空支票。如果要忽略空值,最好不要在第一个位置插入它们。我想,如果在整个代码中检查
,它将消除大量额外的

我还鼓励您不要缩写变量和方法。详细说明“声明”和“投资”等。缩略语更难阅读,简洁也不是一种真正的胜利

同样,尝试使用更具描述性的方法名称
countTransactions
对于主方法更好。对于各种getter,返回列表的方法应该是复数形式:“getAccounts”而不是“getAccount”。注意getter现在是如何匹配类名的;如果知道类名,就知道getter名称。您不必猜测其中一个是否缩写:

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

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

 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;
}
private int countTransactions(对象t)
{
整数和=0;
如果(t==null)返回0;
for(int i=0;i
谢谢John,我还在使用java 7,有什么建议可以在java 7中使用吗。当我从没有control.IMHO的其他地方获取此信息时,也可能存在空值,如果没有Java 8+,则无法跳出循环。此外,如果您的代码正常,您的问题更适合@Hars,请将Java 7的限制放在问题中,因为Java 8是标准,更不用说明天将正式发布Java 11。@John:谢谢您的方法命名建议,这只是本文的一个简单示例,因此名称不准确。同样在真实数据中,我有6个嵌套列表,所以我将使用大约5个循环,这样可以吗?我将使用BFS方法,使用队列。通过这种方式,您可以获得可能的对象,并且在循环内部,您可以很容易地找到该对象是否为嵌套类型。让我知道数据示例,以便在这里给出任何代码示例。也许可以看看访问者模式。@JohnKugelman嵌套的级别是unknown@JohnKugelman是的,如果嵌套程度更高,例如6-7,该怎么办?@JohnKugelman OP提到了这一点“我有一个对象,其中包含另一个对象的列表,其中包含另一个对象的列表,等等…”它不起作用。这些类有不同的方法来访问内部列表。用户可能会更改方法或添加包装器方法。。。