Как посчитать размер вложенных элементов списка с помощью Java 7? - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть объект, который содержит список другого объекта, который содержит список другого объекта и т. Д.чем использовать традиционный цикл for в Java, как я сделал в примере ниже -

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 голосов
/ 24 сентября 2018

Рекурсия может работать в этом случае: общая идея ниже:

 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;
}
0 голосов
/ 24 сентября 2018

В 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».Обратите внимание, как получатели теперь соответствуют именам классов;если вы знаете имя класса, вы знаете имя получателя.Вам не нужно угадывать, сокращен ли один или другой:

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